【问题标题】:Merge nested lists inside list of lists [duplicate]合并列表列表中的嵌套列表[重复]
【发布时间】:2021-04-10 10:14:21
【问题描述】:

我有一个非常庞大的格式列表:

a = [[[5],[3]],[[4],[5]],[[6],[7]]]

我想从最里面的列表中取出列表中的每个元素。输出应该是:

output = [[5,3],[4,5],[6,7]]

我尝试了一些方法,例如reduce(operator.concat, a))sum(b, []))reduce(lambda x,y: x+y,a)。但他们没有产生我想要的东西。我有大量数据,如果可能的话,我不想使用 for 循环。你知道这个的另一种选择吗?

【问题讨论】:

  • 我无法编辑,我无法关闭。我能为这篇文章做些什么,我需要你的建议@wovano
  • 据我所知,您仍然可以编辑问题。我恢复了您上次的编辑,因为它没有改善问题:您添加的内容不应包含在问题中。有关网站如何运作的问题,请访问帮助中心或使用元网站。无法删除,因为其他人已经花时间回答您的问题。如果您的问题得到了解答,您可以就这样离开。
  • 我明白了,但由于问题重复,我无法删除它。更改/编辑问题将再次给我一个以更好的写作重复的问题...由于这些错误,我无法提问,我尝试处理,但似乎很难...跨度>
  • 您无法删除它,因为该问题已经有投票的答案。重复的事实并不重要。请在发布您的下一个问题之前阅读How do I ask a good question?,以避免此类事情。祝你未来好运。

标签: python list


【解决方案1】:

您可以将itertools.chain列表理解一起使用:

>>> from itertools import chain
>>> a = [[[5],[3]],[[4],[5]],[[6],[7]]]

>>> [list(chain(*l)) for l in a]
[[5, 3], [4, 5], [6, 7]]

更多详情请参考"itertools.chain()" documentation

【讨论】:

    【解决方案2】:

    这样就可以了:

    a = [[x[0][0], x[1][0]] for x in a]
    

    这假定每个列表中始终只有 2 个元素。

    一个通用的解决方案是:

    a = [[y[0] for y in x] for x in a]
    

    【讨论】:

      【解决方案3】:

      @moinuddin-quadri 已经指出了优雅的解决方案。以为我会添加一些品种。这是最小的,但还有另一种方法。

      也可以通过chain.from_iterablefunction解决,虽然解决方法会读长一些。 chain.from_iterable 是链的替代构造函数。

      from itertools import chain
      
      a = [[[1],[2]],[[3],[4],[5]],[[6],[7]],[[8],[9],[10],[11]]]
      
      list(map(list,map(chain.from_iterable, a)))
      

      这给了

      [[1, 2], [3, 4, 5], [6, 7], [8, 9, 10, 11]]
      

      两种方法在时间上几乎相当,如下所示。

      from itertools import chain
      import timeit
      a = [[[1],[2]],[[3],[4],[5]],[[6],[7]],[[8],[9],[10],[11]]]
      
      def Chain(a):
          [list(chain(*l)) for l in a]
      
      def Chain_From_Iterable(a):
          list(map(list,map(chain.from_iterable, a)))
      
      print("From chain method: ", timeit.timeit("Chain(a)", number=1000000, globals=globals()))
      print("From chain.from_iterable method: ", timeit.timeit("Chain_From_Iterable(a)", number=1000000, globals=globals()))
      
      From chain method:  3.0528709329992125
      From chain.from_iterable method:  2.7632316279996303
      

      下面是他们两个的输出

      【讨论】:

        【解决方案4】:

        展平每个元素:

        a = [[[5],[3]],[[4],[5]],[[6],[7]]]
        
        output = [[item for subsublist in sublist for item in subsublist] for sublist in a]
        

        【讨论】:

          【解决方案5】:

          如果我正确理解您的问题,那么以下解决方案应该可以工作。

          from functools import reduce
          import operator
          
          starting_list = [[[5],[3]],[[4],[5]],[[6]]]
          final_list = list(map(lambda x: reduce(operator.concat, x),starting_list))
          print(final_list)
          

          【讨论】:

            【解决方案6】:
            from itertools import chain, starmap
            from operator import concat
            xss = [[[5],[3]],[[4],[5]],[[6],[7]]]
            
            def star(f):
              return lambda xs: f(*xs)
            
            print(list(map(star(concat), xss)))
            print(list(starmap(concat, xss)))
            print([concat(*xs) for xs in xss])
            print([list(chain(*xs)) for xs in xss])
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-09-27
              • 1970-01-01
              • 1970-01-01
              • 2020-05-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多