假设我有三个列表:
18, Adam
45, Kapil
23, Nitin
20, Sam
我希望生成所有组合,其中我从列表1取五个元素,从列表2取两个元素,从列表3取三个元素。
例如
list1 --> [a, b, c, d, e, f, g, h]
list2 --> [i, j, k]
list3 --> [l, m, n, o, p]
我尝试使用itertools.combinations。
a, b, c, d, e, i, j, l, m, n
a, b, c, d, e, i, j, l, m, o
etc.
但是我得到的输出仅在list3上发生迭代。在所有输出中,仅存在list1的前五个元素和list2的前两个元素。没有与这两个列表中的其他元素组合。
有人可以在这里帮助我,也可以解释我到底想念什么?
答案 0 :(得分:11)
作为重新生成组合列表的替代方法,请预先计算组合的 product ;这样也可以避免嵌套for
循环。
from itertools import combinations, product
list1 = list("abcdefgh")
list2 = list("ijk")
list3 = list("lmnop")
l1 = combinations(list1, 5)
l2 = combinations(list2, 2)
l3 = combinations(list3, 3)
for c1, c2, c3 in product(l1, l2, l3):
sample = c1 + c2 + c3
print(sample)
答案 1 :(得分:8)
在第一次用尽之后,不要多次在同一个迭代器上进行迭代。每次都迭代一个新的迭代器:
for l1_iterator in itertools.combinations(list1, 5):
for l2_iterator in itertools.combinations(list2, 2):
for l3_iterator in itertools.combinations(list3, 3):
sample = l1_iterator + l2_iterator + l3_iterator
print(sample)
或预先列出每个列表,以避免重新计算:
l1_combinations = list(itertools.combinations(list1, 5))
l2_combinations = list(itertools.combinations(list2, 2))
l3_combinations = list(itertools.combinations(list3, 3))
for l1_iterator in l1_combinations:
for l2_iterator in l2_combinations:
for l3_iterator in l3_combinations:
sample = l1_iterator + l2_iterator + l3_iterator
print(sample)