【问题标题】:Python - remove duplicate of dict that contains list of listsPython - 删除包含列表列表的dict副本
【发布时间】:2018-10-12 07:29:06
【问题描述】:

假设training_data 是一个包含列表列表的字典 比如{1: [[1, 2], [1, 3], [1, 2, 5]], 2: [[1], [5], [1, 6]], 3: [[7], [5]]}

我想合并training_data 中的每个值,然后将它展平一次到一个列表中,这样它就会变成[[1,2,3,5],[1,5,6],[7,5]]

【问题讨论】:

    标签: python list


    【解决方案1】:

    您可以通过单行理解、链接和使用集合 + 排序来获得相同的结果

    import itertools
    
    d = {1: [[1, 2], [1, 3], [1, 2, 5]], 2: [[1], [5], [1, 6]], 3: [[7], [5]]}
    
    result = [sorted(set(itertools.chain.from_iterable(v))) for v in d.values()]
    
    print(result)
    

    输出:

    [[1, 2, 3, 5], [1, 5, 6], [5, 7]]
    

    【讨论】:

      【解决方案2】:

      如果您只需要列表中的唯一元素而不维护初始列表中元素的顺序,那么您可以在此处使用setitertools.chain.from_iterable。您可以将这些与 列表理解 一起使用来实现您想要的列表:

      >>> from itertools import chain
      >>> my_dict = {1: [[1, 2], [1, 3], [1, 2, 5]], 2: [[1], [5], [1, 6]], 3: [[7], [5]]}
      
      >>> [list(set(chain.from_iterable(v))) for v in my_dict.values()]
      [[1, 2, 3, 5], [1, 5, 6], [5, 7]]
      

      注意:由于字典在 Python

      要在合并时保留子列表中元素的顺序,请查看:Pythonic way to merge two overlapping lists, preserving order

      【讨论】:

        【解决方案3】:

        我找到了一个可能的解决方案,但谁能告诉我是否有更简单的方法?

        training_data = list(chain.from_iterable([transaction for _, transaction in training_data.items()]))
        
        new_training_data = []
        for transaction in training_data:
            t = set()
            for i in transaction:
                t = t.union(i)
            new_training_data.append(list(t))
        

        【讨论】:

        • 您可以将[transaction for _, transaction in training_data.items()] 替换为training_data.values()
        • 您不需要将链式调用转换为列表。联合代码可以缩短为set().union(*transaction)。然后整个事情可以变成一个列表理解。
        【解决方案4】:

        您可以将set 与列表理解一起使用:

        training_data = {1: [[1, 2], [1, 3], [1, 2, 5]], 2: [[1], [5], [1, 6]], 3: [[7], [5]]}
        
        resultList = [sorted(set(elem for subList in training_data[key] for elem in subList)) for key in training_data.keys()]
        print(resultList)
        

        输出:

        [[1, 2, 3, 5], [1, 5, 6], [5, 7]]
        

        【讨论】:

          猜你喜欢
          • 2021-11-20
          • 1970-01-01
          • 1970-01-01
          • 2018-12-03
          • 2017-09-23
          • 1970-01-01
          • 2021-03-08
          • 2018-05-13
          • 1970-01-01
          相关资源
          最近更新 更多