itertools 是否允许从多个列表创建列表,我在其中设置了每个列表的选择数量限制?

Can itertools allow for list to be created from multiple lists where I set a limit to how many selections per list?

我有一个正在使用 itertools.product 的列表列表,但我不想将 selection 限制为每个列表 1 个项目。有没有办法让它从一个列表中限制 3 个,从下一个列表中限制 2 个,依此类推?

列表大小不一,在一个列表中也是如此。

例如:

[[1,2,3,4,5],[4,6,45,2,5],[6,5,8,4,47,34],[5,7,23 ,8,3,10]]

我希望能够从列表中select以下金额:

3、4、1、2

每个数字只能 selected 每组每次迭代一次。

感谢您对此的任何帮助。

您可以根据需要重复现有列表,并将该较长列表传递给 itertools.product

,从而创建一个新的更长的列表列表
from itertools import product

def multi_product(lists, repeats):
    repeated_iterables = [
        lst
        for lst, repeat in zip(lists, repeats)
        for i in range(repeat)
    ]
    return product(*repeated_iterables)

或者,您可以使用 2 层 product:

from itertools import product

def flatten(lst):
    return [ x for it in list for x in it ]

def multi_product(lists, repeats):
    producted = [ product(lst, repeat) for lst, repeat in zip(lists, repeats) ]
    return ( flatten(x) for x in product(*producted) )

flatten 的使用保证您得到一个简单的平面列表,但是如果您希望原始列表的值是 "grouped",您可以删除它。本例的解决方案更简单:

def multi_product(lists, repeats):
    producted = [ product(lst, repeat) for lst, repeat in zip(lists, repeats) ]
    return product(*producted)