当前位置: 首页 > 知识库问答 >
问题:

在Python中生成列表长度为k的所有排列的递归算法

楚冷勋
2023-03-14

以下是我的想法:

对于列表中的每个元素,我可以删除它,然后要求递归函数返回长度k-1的所有排列,然后将删除的数字添加到每个排列中。然后对列表中的所有数字重复此过程。

基本情况是列表为空或只包含一个元素。在这些情况下,我只返回列表。也就是说,只要k小于或等于列表的长度(例如,如果k3,但是L=[1,2],我就不能产生任何长度排列k)。

def permutations(l, k):
w = len(l)
if (k <= w): # list is bigger than the length each permutations
    if (w <= 1):
        return list(l)
    else:
        result = []
        for element in l:
            listSmaller = l[:element] + l[element+1:]
            for perm in permutations(listSmaller, k-1):
                result.append([perm] + element)
        return result      
else: # list is not bigger than the length of the permutations, impossible.
    print("k cannot exceed length of list")

我应该如何修改这个?

共有1个答案

益稳
2023-03-14

有两个问题:

首先:[perm]+element在这里,您将向整数添加一个列表。

第二:listsmower=L[:element]+L[element+1:]这里需要一个索引来访问列表的元素。您当前将这些元素用作索引,因此将获得indexerror,因为当element=4时,element+1将为5,但您没有L[4+1:]

for i, element in enumerate(l):
    listSmaller = l[:i] + l[i+1:]

    for perm in permutations(listSmaller, k-1):
        result.append([perm] + [element])
 类似资料:
  • 问题内容: 假设我们有一个字母“ abcdefghiklimnop”。如何以有效的方式递归地生成排列在FIVE组中的此字母重复的排列? 我几天来一直在为此苦苦挣扎。任何反馈将有所帮助。 本质上,这与以下操作相同:生成给定字符串的所有排列 但是,我只希望整个字符串的长度为5。我还无法弄清楚这一点。 因此,对于“ abcdefghiklimnop”的所有长度为5的所有子串,请查找子串的排列。例如,如果

  • 问题内容: 我正在尝试生成所有可能的长度N总计为S的列表。我已经编写了一些代码来这样做,但是在任何大的东西上(特别是我希望N = 5,S = 100),我都遇到了内存溢出错误。 我正在寻找一个更好的解决方案,或者一种方法来改进我的代码,以便可以在N = 5,S = 100上运行它。下面的这两个程序协同工作,以在嵌套列表中创建所有可能的数字组合,然后将它们重新加工为正确的格式。以下是一些示例输出。

  • 问题内容: 如何在Python中生成一个列表的所有排列,独立于该列表中元素的类型? 例如: 问题答案: 从Python 2.6(如果你使用的是Python 3)开始,你可以使用标准库工具:itertools.permutations。 如果你出于某种原因使用旧版Python(),或者只是想知道它的工作原理,那么这是一种不错的方法,取自 http://code.activestate.com/rec

  • 问题内容: 这是问题: 给定Python中的项目列表,我将如何获得这些项目的所有可能组合? 这个站点上有几个类似的问题,建议使用itertools.combine,但是仅返回我需要的一部分: 如您所见,它仅按严格顺序返回项目,而不返回(2,1),(3,2),(3,1),(2、1、3),(3、1、2),( 2,3,1)和(3,2,1)。有一些解决方法吗?我似乎什么都没想。 问题答案: 用途: 帮助:

  • 问题内容: 我正在寻找一种生成元素列表的所有可能排列的方法。类似于python的 区别在于我不在乎排列是按需生成(例如python中的生成器)还是全部生成。我也不关心它们是否按字典顺序排序。我所需要做的就是以某种方式获得这些排列。 问题答案: 产生置换的算法很多。我发现的最简单的方法之一是堆算法: 通过选择一对要交换的元素,它会根据前一个生成每个排列。 在上面的链接中概述了这个想法和一个伪代码一个

  • 问题内容: 我正在使用Python 2.7。 我有一个清单,我想要所有可能的有序组合。 这将给出以下输出: 但是我只希望输出是与列表相同顺序的组合。例如删除,,以及因为这些都不是正确的顺序相比列表。 我想通了用这个代替: 给我我想要的输出: 但是Python中是否有任何我想要的内置方法? 问题答案: 我相信您正在寻找的是原始列表中的所有可能 片段 。您所需的输出转换成切片是这样的: 因此,您应该尝