Python中生成列表长度为k的所有排列的递归算法
我想创建一个递归算法来生成所有排列 具有某个长度的整数列表的指定长度Python中生成列表长度为k的所有排列的递归算法,python,algorithm,recursion,permutation,Python,Algorithm,Recursion,Permutation,我想创建一个递归算法来生成所有排列 具有某个长度的整数列表的指定长度n 以下是我的想法: 对于列表中的每个元素,我都可以删除它,然后让递归函数返回所有长度为k-1的排列,然后将删除的数字添加到每个排列中。然后对列表中的所有数字重复此过程 基本情况是当列表为空或仅包含一个元素时。 在这种情况下,我只返回列表。也就是说,只要k小于或等于列表的长度(例如,如果k是3,但是l=[1,2],我就不能产生任何长度的排列k) 这是我写的: def permutations(l, k): w = len(l)
n
以下是我的想法:
对于列表中的每个元素,我都可以删除它,然后让递归函数返回所有长度为k-1
的排列,然后将删除的数字添加到每个排列中。然后对列表中的所有数字重复此过程
基本情况是当列表为空或仅包含一个元素时。
在这种情况下,我只返回列表。也就是说,只要k小于或等于列表的长度(例如,如果k
是3
,但是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")
def置换(l,k):
w=len(l)
在python中,当使用
for a in b:
“a”实际上不是一个可以用作索引的数字,而是指向列表“b”中实际元素的指针
b = ["Bob", "Jim", "Jane"]
然后在第一次迭代中,“a”将等于“Bob”,而不是0
如果要生成索引号而不是指向元素的指针,可以使用:
for a in range(0, len(b)):
相反,使用它,您的代码应该可以工作
e、 g
在python中,当使用
for a in b:
“a”实际上不是一个可以用作索引的数字,而是指向列表“b”中实际元素的指针
b = ["Bob", "Jim", "Jane"]
然后在第一次迭代中,“a”将等于“Bob”,而不是0
如果要生成索引号而不是指向元素的指针,可以使用:
for a in range(0, len(b)):
相反,使用它,您的代码应该可以工作
e、 g
有两个问题:
首先:[perm]+元素
这里您将向整数添加一个列表
Second:listSmaller=l[:元素]+l[元素+1:]
在这里,您需要一个索引来访问列表中的元素。您当前正在使用这些元素作为索引,因此将获得一个索引器
,因为当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])
有两个问题:
首先:[perm]+元素
这里您将向整数添加一个列表
Second:listSmaller=l[:元素]+l[元素+1:]
在这里,您需要一个索引来访问列表中的元素。您当前正在使用这些元素作为索引,因此将获得一个索引器
,因为当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])
#code采用列表lst和int n表示排列的长度
#返回lst中项目长度为n的所有排列
def Perm(lst,n):
#如果置换长度为负或0,则返回空
如果n#code采用列表lst和int n表示置换的长度
#返回lst中项目长度为n的所有排列
def Perm(lst,n):
#如果置换长度为负或0,则返回空
如果您试图从头开始,这将不会有帮助,但是您是否查看了pythonitertools
模块?能否提供导致报告错误的排列的参数?谢谢!当您在l:
中使用元素时,元素
不再是从0但列表中的单个元素l
,一次一个。现在,当访问列表中的元素l
时,您不能使用,l[:元素]
或l[元素+1::::
。您需要一个索引,可以使用enumerate as为i获取,enumerate(l)中的元素:
,然后您可以使用l[:i]+l[i:]
我一直在测试置换([1,2,3,4],3)而且,置换是一个列表,所以不应该用[]来包装它。元素是一个int,所以应该用[]来包装它(在结果的附加行中)如果您试图从头开始,这是没有帮助的,但是您看过pythonitertools
模块了吗?您能提供导致报告错误的排列的参数吗?谢谢!当您在l:
中为元素使用时,元素
不再是从0b开始的索引ut列表中的单个元素,一次一个。现在,当访问列表中的元素时,您不能使用,l[:element]
或l[element+1:://code>。您需要一个索引,您可以使用enumerate as为i获取该索引,enumerate(l)中的元素:
,然后您可以使用l[:i]+l[i:]
我一直在测试置换([1,2,3,4],3)而且,置换是一个列表,所以不应该用[]来包装它。元素是一个int,所以应该用[]来包装它(在结果的附加行中)虽然此代码片段可以解决问题,但确实有助于提高您的文章质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。虽然此代码片段可以解决问题,但确实有助于提高您文章的质量。请记住如果您将来为读者回答这个问题,那么这些人可能不知道您的代码建议的原因。