Python 遍历列表并比较列表中的dict
我有这样一份清单:Python 遍历列表并比较列表中的dict,python,list,dictionary,Python,List,Dictionary,我有这样一份清单: [(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, 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'})]
我想通过这个列表进行迭代,以便将这些dict相互比较。然后我想自己列一张日期相同的单子。我该怎么做
结果应该是:
列表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'})]
如果
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]) ]
结果将如下所示:
[ [ (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'}) ] ]
这正是你想要的