簡體   English   中英

Python 連接兩個列表,第一個索引相同

[英]Python join two lists with first index in common

我有兩個帶有以下數據的 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)]

但這似乎不起作用。

簡單(非最佳)單線:

[[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. 將兩個元素的列表轉換為字典:
>>> 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]]

此合並list1list2使用heapq.merge (假設日期在每個列表中排序並且在每個列表中沒有重復的日期):

import datetime
from heapq import merge
from pprint import pprint

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]]

i1 = ((1, v) for v in list1)
i2 = ((2, v) for v in list2)

d = {}
for v in merge(i1, i2, key=lambda k: k[1]):
    d.setdefault(v[1][0], {})[v[0]] = v[1][1]

out = []
for k, v in d.items():
    out.append((k, *[v.get(i, 0) for i in range(1, 3)]))

pprint(out)

打印:

[(datetime.date(2019, 12, 11), 4, 0),
 (datetime.date(2019, 12, 14), 3, 2),
 (datetime.date(2019, 12, 16), 0, 9)]
  1. 將兩個列表列表轉換為字典:

    dict1 = dict(list1) dict2 = dict(list2)

  2. 將新列表形成為:

    new_list = [[a,b,dict2.get(a,0)] for a,b in dict1.iteritems()] + [[a,0,b] for a,b in dict2.iteritems() 如果不是在dict1]

你能更清楚你想要做什么嗎?

據我了解,您想要創建一個新的嵌套列表,其中該列表中的每個項目都是輸入列表中具有相同日期時間值的項目的組合。 其他位置說明什么?

在你的例子中:

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

這些條目中的4,0 3,2 0,9對應什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM