【问题标题】:How flatten a list of lists one step如何扁平化列表列表一步
【发布时间】:2010-12-13 21:47:19
【问题描述】:

我有一个元组列表

A= [ [(1,2,3),(4,5,6)], [(7,8,9),(8,7,6),(5,4,3)],[(2,1,0),(1,3,5)] ]

外部列表可以有任意数量的内部列表,内部列表可以有任意数量的元组,一个元组总是有3个整数。

我想生成元组的所有组合,每个列表一个:

[(1,2,3),(7,8,9),(2,1,0)]
[(1,2,3),(7,8,9),(1,3,5)]
[(1,2,3),(8,7,6),(2,1,0)]
...
[(4,5,6),(5,4,3),(1,3,5)]

一个简单的方法是使用类似于itertools.poduct()的函数 但必须这样调用

itertools.product([(1,2,3),(4,5,6)], [(7,8,9),(8,7,6),(5,4,3)],[(2,1,0),(1,3,5)])

即外部列表被删除。我不知道该怎么做。有没有更好的方法来生成所有元组组合?

【问题讨论】:

  • 列表的嵌套级别可以有多深。只有 2 个,就像你的例子一样?
  • @S Lott,相关但不重复。 (我也这么认为,最初,我认为“flatten”关键字具有误导性。想编辑标题但没有找到更好的表达方式;也许是“枚举组合”......
  • 也许是错误的词,但当我写这个问题时,我认为它是关于“扁平化”的。不,这不是家庭作业。我获得了 83 年的学位,那时一直在工作。但是python是新的。试图解决瑞典报纸上的测验导致我迄今为止的所有问题。
  • “笛卡尔积”也许就是您要找的词。

标签: python


【解决方案1】:
itertools.product(*A)

更多详情请查看python tutorial

【讨论】:

    【解决方案2】:

    这适用于您的示例,如果只有一层嵌套列表(没有列表列表的列表):

    itertools.product(*A)
    

    【讨论】:

      【解决方案3】:

      您可能可以像这样调用 itertools.product:

      itertools.product(*A) # where A is your list of lists of tuples
      

      这样,它会将列表的元素扩展为您正在调用的函数的参数。

      【讨论】:

        【解决方案4】:

        聚会迟到了,但是……

        我是 python 新手,来自 lisp 背景。这就是我想出的(查看 lulz 的 var 名称):

        def flatten(lst):
            if lst:
                car,*cdr=lst
                if isinstance(car,(list)):
                    if cdr: return flatten(car) + flatten(cdr)
                    return flatten(car)
                if cdr: return [car] + flatten(cdr)
                return [car]
        

        似乎有效。测试:

        A = [ [(1,2,3),(4,5,6)], [(7,8,9),(8,7,6),(5,4,3)],[(2,1,0),(1,3,5)] ]
        
        flatten(A)
        

        结果:

        [(1, 2, 3), (4, 5, 6), (7, 8, 9), (8, 7, 6), (5, 4, 3), (2, 1, 0), (1, 3, 5)]
        

        注意:car,*cdr=lst 行仅适用于 Python 3.0

        【讨论】:

        • -1 声明 car,*cdr=lst 甚至不是合法的 Python。 Python 中没有直接的语法来拆分列表的头部和尾部(抱歉)。
        • @ThomasH:它在 Python 3 中有效。请参阅 python.org/dev/peps/pep-3132。 +1 以抵消不必要的反对票。
        • @StevenRumbalski 感谢您的指点。我以为我也在检查 Python 3 文档,但显然错过了*target
        【解决方案5】:

        这并不完全是一个步骤,但如果由于某种原因您不想使用 itertools 解决方案,这将满足您的需求:

        def crossprod(listoflists):
            if len(listoflists) == 1:
                return listoflists
            else:
                result = []
                remaining_product = prod(listoflists[1:])
                for outertupe in listoflists[0]:
                    for innercombo in remaining_product[0]:
                        newcombo = [outertupe]
                        newcombo.append(innercombo)
                        result.append(newcombo)
                return result
        

        【讨论】:

          【解决方案6】:
          def flatten(A)
              answer = []
              for i in A:
                  if type(i) == list:
                      ans.extend(i)
                  else:
                      ans.append(i)
              return ans
          

          【讨论】:

          • 你需要修正你的缩进。
          • 非常抱歉出现缩进错误。事实证明,当我粘贴到此处时,从本地 IDE 复制代码不会保留正确的缩进
          【解决方案7】:

          这也可以使用列表推导来实现。

          In [62]: A = [ [(1,2,3),(4,5,6)], [(7,8,9),(8,7,6),(5,4,3)],[(2,1,0),(1,3,5)] ]
          
          In [63]: improved_list = [num for elem in A for num in elem]
          
          In [64]: improved_list
          Out[64]: [(1, 2, 3), (4, 5, 6), (7, 8, 9), (8, 7, 6), (5, 4, 3), (2, 1, 0), (1, 3, 5)]
          

          【讨论】:

            猜你喜欢
            • 2016-01-14
            • 2012-07-01
            • 2017-09-24
            • 1970-01-01
            • 2019-11-29
            • 2017-02-27
            • 2014-10-29
            • 2010-12-08
            相关资源
            最近更新 更多