合并两个列表

3

我有两个Python列表:

L1=[[100, 1], [101, 2]]
L2=[[100, 3], [101, 4], [102, 5]]

我想将它们合并以获得以下结果:
L_merge=[[100, 4], [101, 6], [102, 5]]

两个列表的大小可能不相同很重要。

我试图使用字典,但无法弄清楚。我很乐意使用numpy,pandas或任何其他工具来获取合并结果。


从上面链接的解决方案进行调整:collections.Counter(dict(L1)) + collections.Counter(dict(L2))。可能有一种方法可以跳过先将列表转换为dict的步骤。请参见https://dev59.com/L2gu5IYBdhLWcg3wfHE_。 - vaultah
你了解这两个列表吗?它们都已经排好序了吗?中间可能会有“缺口”,一个列表中有但另一个列表中没有的项。你确定每个项目都是由两个整数组成的列表吗?等等。 - Rory Daulton
“duplicate”问题是关于合并字典而不是列表的。 - mkj
@ Rory Daulton,因为你可以事先进行排序,所以排序不应该是一个问题。中间的空隙肯定是可能出现的情况。是的,列表中的每个项目都有两个整数,但如果你有更多的整数,那将会很有趣,然而所有被合并的列表将具有相同数量的项目。 - valenzio
3个回答

5
你可以在这两个列表上使用 collections.Counter 并将它们简单地求和:
from collections import Counter

L1 = [[100, 1], [101, 2]]
L2 = [[100, 3], [101, 4], [102, 5]]

L_merge = (Counter(dict(L1)) + Counter(dict(L2))).items()
print(list(L_merge))
# [(100, 4), (101, 6), (102, 5)]

这个很好用,只是一个快速的跟进问题:为什么 list(L_merge) 会产生元组而不是列表?有什么方法可以避免它(只是出于好奇)? - valenzio
@valenzio 字典的 items 方法会生成一个元组列表。你可以使用列表推导式将元组转换为列表。 - Moses Koledoye

0

为什么不直接使用for循环:

L_merge = L2
for i in len(L1):
    L_merge[i][-1] += L1[i][-1]

唯一的注意事项是,仅当L2是两个列表中较长的列表时才起作用


是的,那个方法可行,我猜你可以事先检查哪个列表更长,但这似乎相当麻烦。 - valenzio

0
L1=[[100, 1], [101, 2]]
L2=[[100, 3], [101, 4], [102, 5]]

d = {}
for a,b in L1+L2:
  d[a] = d.get(a,0) + b
L_merge = [[k,v] for k,v in d.items()]

print(L_merge)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接