我想创建一个将生成所有排列的递归算法
长度为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")
我不断收到TypeError: can only concatenate list (not "int") to list
我应该如何修改呢?
答案 0 :(得分:1)
有两个问题:
第一:[perm] + element
在这里,您将列表添加到整数中。
第二:listSmaller = 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])
答案 1 :(得分:0)
在python中,使用时
for a in b:
'a'实际上不是可以用作索引的数字,而是指向列表'b'中实际元素的指针。换句话说,如果我有以下列表
b = ["Bob", "Jim", "Jane"]
然后在第一次迭代中,“ a”等于“ Bob”,而不是0。
当您要生成索引号而不是指向元素的指针时,可以使用:
for a in range(0, len(b)):
相反。使用此功能,您的代码即可正常工作。
例如
for element in range(0, len(l)):
listSmaller = l[:element] + l[element+1:]
for perm in permutations(listSmaller, k-1):
result.append([perm] + element)
return result
答案 2 :(得分:0)
# code takes list lst and int n denoting length of permutation
# returns all permutations of length n over items in lst
def Perm(lst,n):
# if length of permutation is negative or 0, return empty
if n<=0:
return [[]]
# else take empty list l
l=[]
# loop over whole lst
for i in range(0,len(lst)):
m=lst[i] # current element of lst (ith)
remLst=lst[:i] + lst[i+1:] # remaining list i.e. all elements except ith
# recursive call to Perm with remaining list and decremented length
for p in Perm(remLst,n-1):
# append current element + all sublists p generated through recursion as an item in list l
l.append([m]+p)
return l
# some examples
# all permutations of length 2 over characters A,B,C
print(Perm(['A','B','C'],2))
# output: [['A', 'B'], ['A', 'C'], ['B', 'A'], ['B', 'C'], ['C', 'A'], ['C', 'B']]
# all permutations of length 2 over characters 1,2,3,4
print(Perm([1,2,3,4],2))
# output: [[1, 2], [1, 3], [1, 4], [2, 1], [2, 3], [2, 4], [3, 1], [3, 2], [3, 4], [4, 1], [4, 2], [4, 3]]