List 合并两个元组列表并在元组中添加非唯一值的Pythonic方法是什么?

List 合并两个元组列表并在元组中添加非唯一值的Pythonic方法是什么?,list,python,List,Python,我正在寻找重构下面Python代码的最佳方法。我认为有一种类似python的方法可以在2到3行代码中实现这一点,但我无法理解。我搜索了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

我正在寻找重构下面Python代码的最佳方法。我认为有一种类似python的方法可以在2到3行代码中实现这一点,但我无法理解。我搜索了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
您正在寻找:

如果您想要
元组的
列表

list3 = merged.items()
如果要在没有链的情况下执行此操作,可以按以下方式执行:

from collections import defaultdict

merged = defaultdict(int)

merged.update(list1)

for key, value in list2:
    merged[key] += value
编辑:正如贝尼在评论中指出的那样,在2.7/3.2+上,您可以:

from collections import Counter

merged = Counter(dict(list1))
merged.update(dict(list2))
这要求您将列表转换为dict,但在其他方面是完美的。

您正在寻找:

如果您想要
元组的
列表

list3 = merged.items()
如果要在没有链的情况下执行此操作,可以按以下方式执行:

from collections import defaultdict

merged = defaultdict(int)

merged.update(list1)

for key, value in list2:
    merged[key] += value
编辑:正如贝尼在评论中指出的那样,在2.7/3.2+上,您可以:

from collections import Counter

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

这要求你将列表转换为dict,但在其他方面是完美的。

为什么它们是元组列表而不是dict?它们是Django值列表:)那么你为什么不在ORM中这样做?为什么它们是元组列表而不是dict?它们是Django值列表:)那么你为什么不呢在2.7/3.2版本的ORM?中这样做更好。
Counter
s是一个
dict
子类,因此它将作为一个插入式替换。在2.7/3.2版本中更好。
Counter
s是一个
dict
子类,因此它将作为插入式替换。