我想从列表列表中找到所有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']]
答案 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)))