Python itertools是否允许从多个列表中创建列表,其中我对每个列表的选择次数设置了限制?
我有一个使用itertools.product的列表,但我不想将每个列表的选择限制为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]] 我希望能够从列表中选择以下金额: 3,4,1,2 每次迭代,每组只能选择一次每个数字Python itertools是否允许从多个列表中创建列表,其中我对每个列表的选择次数设置了限制?,python,list,python-2.7,generator,itertools,Python,List,Python 2.7,Generator,Itertools,我有一个使用itertools.product的列表,但我不想将每个列表的选择限制为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]] 我希望能够从列表中选择以下金额: 3,4,1,2 每次迭代,每组只能选择一次每个数字 感谢您在这方面提供的帮助。您可以创建一个新的更长的列表,方法是根据需要重复现有列表,并将该更长的列表
感谢您在这方面提供的帮助。您可以创建一个新的更长的列表,方法是根据需要重复现有列表,并将该更长的列表传递给
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)
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) )
或者,您可以使用两层产品
:
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)
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) )
使用flatte
可以保证返回一个简单的平面列表,但是如果希望按原始列表对值进行“分组”,可以将其删除。这种情况下的解决方案更简单:
def multi_product(lists, repeats):
producted = [ product(lst, repeat) for lst, repeat in zip(lists, repeats) ]
return product(*producted)
通过根据需要重复现有列表,并将更长的列表传递给
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)
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) )
或者,您可以使用两层产品
:
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)
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) )
使用flatte
可以保证返回一个简单的平面列表,但是如果希望按原始列表对值进行“分组”,可以将其删除。这种情况下的解决方案更简单:
def multi_product(lists, repeats):
producted = [ product(lst, repeat) for lst, repeat in zip(lists, repeats) ]
return product(*producted)
从第一个列表中选择哪3个数字,等等?从第一个列表中选择3会包括
1、1、1
还是只包含不同的元素?它会是从第一个列表中选择的3个不同的数字。我将调整问题。从第一个列表中选择哪3个数字,等等?从第一个列表中选择3是包括1、1、1
还是只包含不同的元素?它将是从第一个列表中选择的3个不同的数字。我会调整这个问题的。关于这个。今晚我会检查这个答案。我认为你需要使用组合
而不是产品
作为内部级别,因为不需要从同一列表中重复。Ty用于此。今晚我将检查这个答案。我认为您需要使用组合
而不是产品
作为内部级别,因为不需要从同一列表中重复。