【问题标题】:Combinations of multiple lists多个列表的组合
【发布时间】:2019-08-26 16:10:44
【问题描述】:

假设我有三个列表:

list1 --> [a, b, c, d, e, f, g, h]
list2 --> [i, j, k]
list3 --> [l, m, n, o, p]

我希望生成所有组合,其中我从 list1 中获取五个元素,从 list2 中获取两个元素,从 list3 中获取三个元素。

例如。

a, b, c, d, e, i, j, l, m, n  
a, b, c, d, e, i, j, l, m, o
etc.

我尝试使用 itertools.combinations。

l1_combinations = itertools.combinations(list1, 5)
l2_combinations = itertools.combinations(list2, 2)
l3_combinations = itertools.combinations(list3, 3)
for l1_iterator in list(l1_combinations):
    for l2_iterator in list(l2_combinations): #added a missing )
        for l3_iterator in list(l3_combinations):
            sample = l1_iterator + l2_iterator + l3_iterator
            print(sample)

但我只在 list3 上进行迭代得到输出。在所有输出中,只有 list1 中的前五个元素和 list2 中的前两个元素存在。不存在与这两个列表中其他元素的组合。

有人可以在这里帮助我并解释我到底错过了什么吗?

【问题讨论】:

  • 好吧,我敢肯定for l2_iterator in list(l2_combinations: 中缺少的) 没有帮助...

标签: python


【解决方案1】:

在第一次用完之后,不要多次迭代同一个迭代器。每次迭代一个新的迭代器:

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)

【讨论】:

  • 不每次都重新生成组合的解决方案是什么?
【解决方案2】:

作为重新生成组合列表的替代方法,预先计算组合的乘积;这也使您免于嵌套 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-20
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多