为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

温温酱 2022-10-06 16:50:50
对于我正在解决的问题,我有一个字典列表。问题涉及表单的多个查询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}
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

我的第一个直觉是寻找类似 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}


查看完整回答
反对 回复 2022-10-06
?
POPMUISE

TA贡献1765条经验 获得超5个赞

你可以在这里使用 **kwargs


x={1:5,2:10}

y={2:10,3:20}

z={**x, **y}

如果您想进一步优化性能,因为有多个查询,您应该使用“缓存+字典”,因为查找表总是比任何操作都快


查看完整回答
反对 回复 2022-10-06
?
MM们

TA贡献1886条经验 获得超2个赞

尝试这个 -


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 dictionary

dict1 = {1:5,2:10}


# Create second dictionary

dict2 = {2:10,3:20}


# Create third dictionary

dict3 = {1:-2}


dict4 = mergeDict(dict3, mergeDict(dict1, dict2))

请注意,减法逻辑的第三个字典中有“-2”。


查看完整回答
反对 回复 2022-10-06
  • 3 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号