在Python中合并两个元组列表并对非唯一值求和的方式是什么?

1 投票
1 回答
1270 浏览
提问于 2025-04-17 03:01

我在寻找一种更好的方法来重构下面的Python代码。我觉得用2到3行代码就能用一种更“Pythonic”的方式来实现,但我没能找到。虽然我在Stackoverflow上搜索过,但没有找到类似的问题和解决方案。非常感谢!

list1 = [(Python, 5), (Ruby, 10), (Java, 15), (C++, 20)]
list2 = [(Python, 1), (Ruby, 2), (Java, 3), (PHP, 4), (Javascript, 5)]

# I want to make an unsorted list3 like this
# list3 = [(Python, 6), (Ruby, 12), (Java, 18), (PHP, 4), (Javasript, 5), (C++, 20)]
common_keys = list(set(dict(list1).keys()) & set(dict(list2).keys()))

if common_keys:
    common_lst = [(x, (dict(list1)[x] + dict(list2)[x])) for x in common_keys]
    rest_list1 = [(x, dict(list1)[x]) for x in dict(list1).keys() if x not in common_keys]
    rest_list2 = [(x, dict(list2)[x]) for x in dict(list2).keys() if x not in common_keys]
    list3 = common_lst + rest_list1 + rest_list2

else:
    list3 = list1 + list2

1 个回答

5

你在找的是 collections.defaultdict

from collections import defaultdict
from itertools import chain

merged = defaultdict(int)

for key, value in chain(list1, list2):
    merged[key] += value

如果你想要一个包含 tuplelist

list3 = merged.items()

如果你想不使用 chain,可以这样做:

from collections import defaultdict

merged = defaultdict(int)

merged.update(list1)

for key, value in list2:
    merged[key] += value

编辑:正如 Beni 在评论中提到的,在 2.7/3.2+ 版本中,你可以这样做:

from collections import Counter

merged = Counter(dict(list1))
merged.update(dict(list2))

这需要你把列表转换成 dict,但其他方面都很完美。

撰写回答