我有一个这样的清单:
[(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列表。我怎么能这样做?
结果应该是这样的:
列表n
[(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'})]
答案 0 :(得分:1)
鉴于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'})]
答案 1 :(得分:1)
这项任务的设施称为groupby
。但是它使用迭代器并且依赖于要组合在一起的项目已经按顺序排列的事实,因此您可能需要在应用它之前对输入进行排序,具体取决于" sortedness"当然。
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'}) ] ]
这就是你想要的。