python - 生成每个索引具有单独限制的所有排列

标签 python list generator permutation

假设我们有一个列表,例如 [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/

相关文章:

java - 调试 GWT 生成的类

python - 使用 seaborn,我如何在我的散点图中画一条我选择的线?

Canvas 中的python时间 sleep 方法

javascript - 使用 jQuery 和变量的问题

python - 如何根据单独列表中每个字符串内的子字符串获取两个列表之间的差异

r - 如何将 data.frames 分别保存在列表中?

list - 使用递归将列表分解为子列表

python - 如何在不在 Python 中创建中间列表的情况下拆分字符串并重新加入它?

python - python中两个或多个base64字符串的连接

c - 如何使生成的数字不在c中重复?