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

时间:2019-12-17 02:32:06

标签: python python-3.x list

我有一个嵌套列表,其结构与此类似,只是它的长度明显更长:

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

Zip two lists together based on matching date in string

How to merge lists into a list of tuples?

4 个答案:

答案 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: ...)))