我有一个元组列表
列表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)])
即删除外部列表。我不知道该怎么做。有没有更好的方法来生成元组的所有组合?
答案 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)]