多个列表的组合

时间:2019-04-04 19:44:54

标签: python

假设我有三个列表:

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的前两个元素。没有与这两个列表中的其他元素组合。

有人可以在这里帮助我,也可以解释我到底想念什么?

2 个答案:

答案 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)