遍历列表并比较lis中的dict

2024-07-05 14:49:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个清单:

[(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'})]

Tags: name列表datetimedatedict单子firstlast
2条回答

这个任务有一个工具叫做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'}) ] ]

这正是你想要的

如果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'})]

相关问题 更多 >