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)
我有一个正在使用 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)