猿问

如何有效地执行字典合并?

对于我正在解决的问题,我有一个字典列表。问题涉及表单的多个查询merge(a, b, c)。合并意味着,在结果中,公共键的计数被添加/减去,并且不常见的键(及其值)按原样附加。


我目前正在使用 Pythoncollection.Counter来表示字典并执行如下合并:


def merge(a, b, c):

    counter_a, counter_b, counter_c = DICTLIST[a],DICTLIST[b],DICTLIST[c]

    total = counter_a + counter_b - counter_c # Type collections.Counter

    return total

虽然这是一个方便的解决方案,但在问题中,最多可以有 10**5 个这样的查询。在这样的规模上,使用这种方法太慢了。有没有更好的方法来解决这个问题?


注意:合并查询的预计算是不切实际的,因为可能的输入数量非常大。


例子:


DICTLIST[a] = Counter({1:5,2:10})

DICTLIST[b] = Counter({2:10,3:20})

DICTLIST[c] = Counter({1:2})

merge(a,b,c) # Expected Output: {1:3, 2:20, 3:20}


温温酱
浏览 127回答 3
3回答

一只名叫tom的猫

我的第一个直觉是寻找类似 Javascript “spread” 的 Python 运算符:https://mlpipes.com/object-spread-operator-python/这里的例子:old_dict = {'hello': 'world', 'foo': 'bar'} new_dict = {**old_dict, 'foo': 'baz'}对于您的代码,您应该尝试以下操作:DICTLIST[d] = {**a,**b,**c}

POPMUISE

你可以在这里使用 **kwargsx={1:5,2:10}y={2:10,3:20}z={**x, **y}如果您想进一步优化性能,因为有多个查询,您应该使用“缓存+字典”,因为查找表总是比任何操作都快

MM们

尝试这个 -def mergeDict(dict1, dict2):    dict3 = {**dict1, **dict2}    for key, value in dict3.items():    if key in dict1 and key in dict2:        dict3[key] = value + dict1[key]    return dict3然后你可以这样打电话 -# Create first dictionarydict1 = {1:5,2:10}# Create second dictionarydict2 = {2:10,3:20}# Create third dictionarydict3 = {1:-2}dict4 = mergeDict(dict3, mergeDict(dict1, dict2))请注意,减法逻辑的第三个字典中有“-2”。
随时随地看视频慕课网APP

相关分类

Python
我要回答