我有一个嵌套列表,其结构与此类似,只是它的长度明显更长:
mylist = [ ["Bob", "12-01 2:30"], ["Sal", "12-01 5:23"], ["Jill", "12-02 1:28"] ]
我的目标是创建另一个嵌套列表,以组合所有具有相同日期的元素。因此,需要以下输出:
newlist = [ [["Bob", "12-01 2:30"], ["Sal", "12-01 5:23"]], [["Jill", "12-02 1:28"]] ]
上面,所有日期为12-01的项目(无论时间如何)都被合并,所有12-02的元素都被合并。
过去1个小时,我一直在认真研究如何执行此操作,但是找不到任何东西。此外,我是编程的初学者,所以我不够熟练,无法尝试创建自己的解决方案。因此,请不要以为我自己没有尝试进行研究或尝试过任何尝试。我将在下面添加一些链接作为我的研究示例:
Collect every pair of elements from a list into tuples in Python
Create a list of tuples with adjacent list elements if a condition is true
How do I concatenate two lists in Python?
Concatenating two lists of Strings element wise in Python without Nested for loops
答案 0 :(得分:5)
在日期时间之前使用dict或orderdict(如果排序很重要)组数据。
from collections import defaultdict # use defaultdict like {}.setdefault(), it's very facility
mylist = [["Bob", "12-01 2:30"], ["Sal", "12-01 5:23"], ["Jill", "12-02 1:28"]]
record_dict = defaultdict(list)
# then iter the list group all date time.
for data in mylist:
_, time = data
date_time, _ = time.split(" ")
record_dict[date_time].append(data)
res_list = list(record_dict.values())
print(res_list)
输出:
[[['Bob', '12-01 2:30'], ['Sal', '12-01 5:23']], [['Jill', '12-02 1:28']]]
答案 1 :(得分:4)
基于纯列表的解决方案,可以替代公认的基于字典的解决方案。这提供了附加功能,可以轻松地对整个列表进行排序,首先按日期排序,然后按小时排序,然后按名称排序
from itertools import groupby
mylist = [["Bob", "12-01 2:30"], ["Sal", "12-01 5:23"], ["Jill", "12-02 1:28"]]
newlist = [dt.split() + [name] for (name, dt) in mylist]
newlist.sort() # can be removed if inital data is already sorted by date
newlist = [list(group) for (date, group) in groupby(newlist, lambda item:item[0])]
# result:
# [[['12-01','2:30','Bob'], ['12-01','5:23','Sal']], [['12-02','1:28','Jill']]]
如果您确实想要与初始列表相同的项目格式,则需要 两次迭代:
newlist = [[[name, date + ' ' + time] for (date, time, name) in group]
for (date, group) in groupby(newlist, lambda item:item[0])]
# result:
# [[['Bob', '12-01 2:30'], ['Sal', '12-01 5:23']], [['Jill', '12-02 1:28']]]
答案 2 :(得分:2)
如果您不介意增加内存使用量,可以尝试使用字典。您可以使用日期作为键并列出值。
all_items = {}
for line in myList:
x, y = line
date, time = y.split()
try:
all_items[date].append(line)
except:
all_items[date] = [line,]
然后,您可以使用键的排序日期来创建新列表。
答案 3 :(得分:1)
如果所有具有相同日期的元素都是连续的,则可以使用itertools.groupby
:
list(map(list, groupby(data, lambda value: ...)))