在嵌套列表中,如果列表包含相同的元素,如何合并列表?

4

我有一个嵌套列表,结构类似于这个,但显然要长得多:

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个小时如何做到这一点,但找不到任何方法。此外,我是编程的初学者,所以没有足够的技能尝试创建自己的解决方案。因此,请不要认为我没有尝试过研究或没有付出努力来解决这个问题。下面是几个我研究的链接: 在Python中将列表中的每对元素收集成元组 如果条件为真,则创建具有相邻列表元素的元组列表 如何在Python中连接两个列表?

在Python中逐元素级联两个字符串列表而不使用嵌套for循环

基于匹配的日期字符串将两个列表合并在一起

如何将多个列表合并为元组列表?

4个回答

5

使用字典或有序字典(如果排序很重要)按日期时间对数据进行分组。

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']]]


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

如果您不介意使用大量内存,可以尝试使用字典。您可以将日期作为键,并创建一个值列表。

all_items = {}
for line in myList:
    x, y = line
    date, time = y.split()
    try:
        all_items[date].append(line)
    except:
        all_items[date] = [line,]

然后,您可以使用排序后的日期作为键创建一个新列表。

1
如果所有具有相同日期的元素都是连续的,则可以使用 itertools.groupby
list(map(list, groupby(data, lambda value: ...)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接