Python:包含一个或多个项目的列表列表中的2项组合

时间:2014-05-20 17:34:54

标签: python arrays list python-2.7 itertools

我想从列表列表中找到所有2项组合。内部列表包含一个或多个项目,并且我不想在同一内部列表中包含项目组合(除非该组合存在于单独的内部列表中)。

有没有办法利用itertools的内置函数来达到我想要的组合要求,还是需要从头开始编写for循环?

这是一个非常简单的例子:

x = [['219'], ['220'], ['218']]
# find combos
print combos
>> [['219', '220'], ['219', '218'], ['220', '218']]

列表可能包含多个项目的列表。这是一个更复杂的例子,其中内部列表包含多个项目:

x = [['222', '219'], ['221'], ['220', '218', '216']]
# find combos
print combos 
>> [['222', '221'], ['222', '220'], ['222', '220'], ['222', '218'], ['222', '216'], ['219', '221'], ['219', '220'], ['219', '218'], ['219', '216'], ['221', '220'], ['221', '218'], ['221', '216']]

1 个答案:

答案 0 :(得分:2)

这个单线程怎么样?

from itertools import combinations, product, chain

x = [['222', '219'], ['221'], ['220', '218', '216']]
combos = list(chain.from_iterable( [list(product(a,b)) for (a,b) in combinations(x,2)]))

编辑:     roippi是绝对正确的。

我们可以摆脱不必要的中间体
combos = list(chain.from_iterable(product(*c) for c in combinations(x,2)))