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

时间:2019-02-24 23:09:31

标签: python python-3.x combinations permutation

在本周的作业中,我被要求编写一个Python脚本,该脚本使用数字n并返回[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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

  

range(stop)

     

这是一种通用功能,用于创建可迭代的变量,从而产生算术级数。

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

数学告诉我们,拥有N个元素,就会有N个!这些元素的不同排列,表示阶乘。我们可以从数学模块中导入阶乘函数,这将很快使我们能够计算列表中的排列数量:

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))