如何将列表列表展平一步

时间:2009-11-06 16:31:10

标签: python

我有一个元组列表

列表
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)])

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

7 个答案:

答案 0 :(得分:10)

itertools.product(*A)

有关详细信息,请查看python tutorial

答案 1 :(得分:2)

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

itertools.product(*A)

答案 2 :(得分:2)

你可以像这样调用itertools.product:

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

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

答案 3 :(得分:2)

晚会但是......

我是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

答案 4 :(得分:1)

这不是一步,但如果出于某种原因你不想使用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

答案 5 :(得分:1)

def flatten(A)
    answer = []
    for i in A:
        if type(i) == list:
            ans.extend(i)
        else:
            ans.append(i)
    return ans

答案 6 :(得分:-1)

这也可以使用列表理解来实现。

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