【问题标题】:Merge two lists together将两个列表合并在一起
【发布时间】:2016-10-30 17:53:38
【问题描述】:

我在 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))。可能有一种方法可以先跳过将列表转换为dicts。见stackoverflow.com/q/11290092/2301450
  • 你对这两个列表了解多少?他们都确定排序了吗?项目在一个列表中但不在另一个列表中的中间是否存在“间隙”?您确定每个项目都是两个整数的列表吗?以此类推。
  • “重复”问题是关于组合字典,而不是列表
  • @Rory Daulton 所以排序应该不是问题,因为你可以事先做到这一点。中间的差距绝对是一个可能的情况。是的,列表中的每个项目都有两个整数,但如果你有超过 2 个整数会很有趣,但是所有合并的列表都会有相同数量的项目。

标签: python merge


【解决方案1】:

您可以在两个列表中使用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 字典的items 方法产生一个元组列表。您可以使用列表推导将元组转换为列表。
【解决方案2】:

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

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

需要注意的是,这仅在 L2 是 2 个列表中较长的一个时才有效

【讨论】:

  • 是的,行得通,我想你可以提前检查哪个列表更长,但这似乎很麻烦
【解决方案3】:
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)

【讨论】:

    猜你喜欢
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多