【问题标题】:Combining lists within a nested list, if lists contain the same element?如果列表包含相同的元素,则在嵌套列表中组合列表?
【发布时间】:2019-12-17 11:44:39
【问题描述】:

我有一个结构与此类似的嵌套列表,但它显然要长得多:

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?

【问题讨论】:

    标签: python python-3.x list


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      纯基于列表的解决方案,作为公认的基于字典的解决方案的替代方案。这提供了轻松排序整个列表的附加功能,首先按日期,然后按小时,然后按名称

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

      【讨论】:

        【解决方案3】:

        如果您不介意占用大量内存,可以尝试使用字典。您可以使用日期作为键并列出值。

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

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

        【讨论】:

          【解决方案4】:

          如果所有相同日期的元素都是连续的,可以使用itertools.groupby

          list(map(list, groupby(data, lambda value: ...)))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-13
            • 1970-01-01
            • 2020-11-20
            • 2016-04-29
            • 1970-01-01
            相关资源
            最近更新 更多