首页 > 解决方案 > Python连接两个具有共同第一个索引的列表

问题描述

我有两个包含以下数据的 python 列表

list1 = [[datetime.date(2019, 12, 11), 4], [datetime.date(2019, 12, 14), 3]]
list2 = [[datetime.date(2019, 12, 14), 2], [datetime.date(2019, 12, 16), 9]]

我必须将两个列表与第一个索引(即datetime.date字段)结合起来才能通用。此外,如果两者的第一个索引都不匹配,请将值设置为。

此外,如果列表中的任何一个为空白,请将相应位置设置为 0。

结果将是

list_new = [
   [datetime.date(2019, 12, 11), 4, 0],
   [datetime.date(2019, 12, 14), 3, 2],
   [datetime.date(2019, 12, 16), 0, 9]
]

我尝试使用zip喜欢

new_list = [a + [b[1]] for (a, b) in zip(list1, list2)]

但这似乎不起作用。

标签: pythonlistzip

解决方案


简单(非最佳)单线:

[[element, dict(list1).get(element, 0), dict(list2).get(element, 0)] for element in set([l[0] for l in list1 + list2])]

解释:

  1. 从列表中获取一组唯一的第一个元素:
>>> s = set([l[0] for l in list1 + list2])
>>> s
set([datetime.date(2019, 12, 11), datetime.date(2019, 12, 14), datetime.date(2019, 12, 16)])
  1. 将两个元素的列表转换为 dict:
>>> d1 = dict(list1)
>>> d1
{datetime.date(2019, 12, 11): 4, datetime.date(2019, 12, 14): 3}
>>> d2 = dict(list2)
>>> d2
{datetime.date(2019, 12, 14): 2, datetime.date(2019, 12, 16): 9}

  1. 最后,形成结果列表:
>>> [[element] + [d1.get(element, 0)] + [d2.get(element, 0)] for element in s]
[[datetime.date(2019, 12, 11), 4, 0], [datetime.date(2019, 12, 14), 3, 2], [datetime.date(2019, 12, 16), 0, 9]]


推荐阅读