[英]Iterating through list and comparing dicts inside of list
我有一個這樣的列表:
[(datetime.date(2014, 4, 15), {'first_name': 'Mike', 'last_name': 'Jackson'}),
(datetime.date(2014, 4, 15), {'first_name': 'Hannah', 'last_name': 'Jackson'}),
(datetime.date(2014, 4, 16), {'first_name': 'Tom', 'last_name': 'Jackson'},
(datetime.date(2014, 4, 16), {'first_name': 'Macy', 'last_name': 'Jackson'})]
我想通過這個列表進行迭代,以便將這些dicts相互比較。 然后我想制作具有相同日期的dicts列表。 我怎樣才能做到這一點?
結果應該是這樣的:
清單
[(datetime.date(2014, 4, 15), {'first_name': 'Mike', 'last_name': 'Jackson'}),
(datetime.date(2014, 4, 15), {'first_name': 'Hannah', 'last_name': 'Jackson'})]
列出n + 1
[(datetime.date(2014, 4, 16), {'first_name': 'Tom', 'last_name': 'Jackson'},
(datetime.date(2014, 4, 16), {'first_name': 'Macy', 'last_name': 'Jackson'})]
鑒於a
是您的列表,此解決方案將起作用:
from itertools import groupby
for k, g in groupby(sorted(a, key=lambda x: x[0]), key=lambda x: x[0]):
print(list(g))
並產生這個輸出
[(datetime.date(2014, 4, 15), {'first_name': 'Mike', 'last_name': 'Jackson'}),
(datetime.date(2014, 4, 15), {'first_name': 'Hannah', 'last_name': 'Jackson'})]
[(datetime.date(2014, 4, 16), {'first_name': 'Tom', 'last_name': 'Jackson'}),
(datetime.date(2014, 4, 16), {'first_name': 'Macy', 'last_name': 'Jackson'})]
這個任務有一個叫做groupby
。 但是它使用迭代器並且依賴於要組合在一起的項目已經按順序排列的事實,因此您可能需要在應用它之前對輸入進行排序,這取決於當然是“排序”。
from itertools import groupby
v = [ (datetime.date(2014, 4, 15), {'first_name': 'Mike', 'last_name': 'Jackson'}),
(datetime.date(2014, 4, 15), {'first_name': 'Hannah', 'last_name': 'Jackson'}),
(datetime.date(2014, 4, 16), {'first_name': 'Tom', 'last_name': 'Jackson'}),
(datetime.date(2014, 4, 16), {'first_name': 'Macy', 'last_name': 'Jackson'}) ]
v.sort() # to ensure that all equal datetimes are together in the list
result = [ list(i) for x, i in itertools.groupby(v, lambda a: a[0]) ]
result
將是這樣的:
[ [ (datetime.date(2014, 4, 15), {'first_name': 'Mike', 'last_name': 'Jackson'}),
(datetime.date(2014, 4, 15), {'first_name': 'Hannah', 'last_name': 'Jackson'}) ],
[ (datetime.date(2014, 4, 16), {'first_name': 'Tom', 'last_name': 'Jackson'}),
(datetime.date(2014, 4, 16), {'first_name': 'Macy', 'last_name': 'Jackson'}) ] ]
這是你想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.