在给定返回列表的下一个排列的函数时查找列表的所有排列

问题描述 投票:-1回答:1

在本周的作业中,我被要求编写一个带有数字n的python脚本,并返回[0,1,2,...,n-1]的所有排列。到目前为止,我已经编写了一个脚本,它接受一个列表并返回列表的下一个排列。我正在寻找关于如何根据我到目前为止所写的内容编写脚本的想法。

def next_permutation(p):
    a = len(p)
    i = a -2 
    while i >= 0 and p[i] >= p[i+1]:
        i = i-1
    if i == -1:
        return []

    j = i+1
    while j < a and p[j] >= p[i]:
        j += 1
    j-=1

    p[i], p[j] = p[j], p[i]

    k = i + 1
    l = a - 1

    while k < l:
        p[k], p[l] = p[l], p[k]
        k += 1
        l -= 1
    return p

编辑:这是返回列表的下一个排列的代码。我完全是根据我的导师提供的指示写的。

python python-3.x combinations permutation
1个回答
0
投票

由于您希望列表的所有排列的数字从0到n-1,因此您已经有了需要采取的明确步骤:

  1. 创建一个包含0到n-1之间所有数字的列表:

这可以通过内置的range()函数轻松完成,因为它主要用于此目的:

range(stop)

这是一个多功能函数,用于创建迭代,从而产生算术进展。

  1. 计算此列表可能具有的排列量:

数学告诉我们有N个元素,会有N!这些元素的不同排列,wher!意味着阶乘。我们可以从数学模块导入阶乘函数,这将很快允许我们计算列表将具有的排列量:

from math import factorial
print(factorial(4)) # 24
  1. 调用你已经多次编写的函数next_permutation(p),并产生每一个排列。

要从函数返回多个内容,可以使用yield。

考虑到这些步骤,您可以创建类似于此的内容:

def all_permutations(n):

    # Constructing a list that contains all numbers from 0 to n-1
    integer_list = list(range(n))

    # Calculating the amount of permutations such list would have
    permutation_count = factorial(n)

    # Output that many permutations
    for _ in range(permutation_count):
        yield integer_list
        integer_list = next_permutation(integer_list)

此生成器函数将生成包含从0到n-1的数字的列表的所有排列,这正是您所需要的。

要创建一个包含所有排列的列表,您可以编写一些简单的内容,例如:

n = 4
all_permutations = list(all_permutations(n))
© www.soinside.com 2019 - 2024. All rights reserved.