假设我们有一个列表,例如[3, 2, 1]
。我想以以下形式生成该列表的所有排列:
[1, 1, 1], [2, 1, 1], [3, 1, 1], [1, 2, 1], [2, 2, 1] , [3, 2, 1]
对于任何长度
n
的列表。这样,原始列表的第i
个元素的值是所有排列的第i
个元素的值的上限。我还想使用使用
yield
的生成器,因为输入列表可能很大(例如n = 30
)。到目前为止,我一直在使用这样的东西:
itertools.product(range(1, 5), repeat=5)
在
for
循环中使用时,具有以下输出:(1, 1, 1, 1, 1), (1, 1, 1, 1, 2), (1, 1, 1, 1, 3), (1, 1, 1, 1, 4), (1, 1, 1, 2, 1), (1, 1, 1, 2, 2), (1, 1, 1, 2, 3), ...
但是,我认为它不允许为排列的每个元素指定自定义限制。
另外,请注意,输入列表的元素不一定必须是连续数字,因此
[25, 17, 10, 4]
是有效输入。 最佳答案
此递归函数按所需顺序返回生成器:
def f(limits):
if not limits:
yield ()
return
for l in f(limits[1:]):
for i in range(1, limits[0]+1):
yield (i,) + l
>>> print(list(f([3, 2, 1])))
[(1, 1, 1), (2, 1, 1), (3, 1, 1), (1, 2, 1), (2, 2, 1), (3, 2, 1)]
关于python - 为每个索引生成具有单独限制的所有排列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51548094/