【问题标题】:flatten list of lists of lists to a list of lists将列表列表展平为列表列表
【发布时间】:2016-01-26 02:47:13
【问题描述】:

我已经搜索过如何展平列表列表(即此处:Making a flat list out of list of lists in Python),但我找不到将列表列表展平为列表列表的解决方案。

我有:

my_list = [ [ [1,2,3],[4,5] ], [ [9],[8,9,10],[3,4,6] ], [ [1] ] ]

我想要:

my_list = [ [1,2,3,4,5], [9,8,9,10,3,4,6], [1] ]

该解决方案也适用于浮动列表。有什么建议吗?

【问题讨论】:

    标签: python list python-2.7 flatten


    【解决方案1】:

    如果我们应用this answer的逻辑,不应该只是:

    In [2]: [[item for subsublist in sublist for item in subsublist] for sublist in my_list]
    Out[2]: [[1, 2, 3, 4, 5], [9, 8, 9, 10, 3, 4, 6], [1]]
    

    并且,同样通过itertools.chain()

    In [3]: [list(itertools.chain(*sublist)) for sublist in my_list]
    Out[3]: [[1, 2, 3, 4, 5], [9, 8, 9, 10, 3, 4, 6], [1]]
    

    【讨论】:

      【解决方案2】:

      这是 fl00r 递归答案的由内而外的版本,与 OP 所追求的更加吻合:

      def flatten(lists,n):
          if n == 1:
              return [x for xs in lists for x in xs]   
          else:
              return [flatten(xs,n-1) for xs in lists]
      
      
      >>> flatten(my_list,1)
      [[1, 2, 3], [4, 5], [9], [8, 9, 10], [3, 4, 6], [1]]
      >>> flatten(my_list,2)
      [[1, 2, 3, 4, 5], [9, 8, 9, 10, 3, 4, 6], [1]]
      

      【讨论】:

        【解决方案3】:

        你可以使用这个递归子程序

        def flatten(lst, n):
          if n == 0:
            return lst
        
          return flatten([j for i in lst for j in i], n - 1)
        
        mylist = [ [ [1,2,3],[4,5] ], [ [9],[8,9,10],[3,4,6] ], [ [1] ] ]
        flatten(mylist, 1)
        #=> [[1, 2, 3], [4, 5], [9], [8, 9, 10], [3, 4, 6], [1]]
        flatten(mylist, 2)
        #=> [1, 2, 3, 4, 5, 9, 8, 9, 10, 3, 4, 6, 1]
        

        【讨论】:

          【解决方案4】:

          对于这种特殊情况,

          In [1]: [sum(x,[]) for x in my_list]
          Out[1]: [[1, 2, 3, 4, 5], [9, 8, 9, 10, 3, 4, 6], [1]]
          

          是最短最快的方法:

          In [7]: %timeit [sum(x,[]) for x in my_list]
          100000 loops, best of 3: 5.93 µs per loop
          

          【讨论】:

          • 不是我不是最快的方法!不要将sum 用于列表。在大列表上效率非常低(二次效应):stackoverflow.com/questions/41772054/…
          • 因此预防措施:对于这种特殊情况。
          猜你喜欢
          • 2012-03-19
          • 2022-11-14
          • 2017-10-09
          • 2013-11-13
          • 1970-01-01
          • 2018-02-11
          • 2013-11-06
          • 2013-04-24
          相关资源
          最近更新 更多