[英]All Permutations of a String in Python (Recursive)
I need a kick in the head on this one.我需要在这个上踢一脚。 I have the following recursive function defined:我定义了以下递归函数:
def perms(s):
if(len(s)==1):
return s
res = ''
for x in xrange(len(s)):
res += s[x] + perms(s[0:x] + s[x+1:len(s)])
return res + '\n'
perms("abc") currently returns: perms("abc") 当前返回:
abccb
bacca
cabba
The desired result is想要的结果是
abc
acd
bac
bca
cab
cba
Where am I going wrong here?我哪里出错了? How can I think about this differently to come up with the solution?我如何以不同的方式思考这个问题以提出解决方案?
Note: I am aware of the itertools function.注意:我知道 itertools 函数。 I am trying to understand how to implement permutations recursively for my own learning.我试图了解如何为我自己的学习递归地实现排列。 That is why I would prefer someone to point out what is wrong with my code, and how to think differently to solve it.这就是为什么我希望有人指出我的代码有什么问题,以及如何以不同的方式思考来解决它。 Thanks!谢谢!
There you go (recursive permutation): 你去(递归排列):
def Permute(string):
if len(string) == 0:
return ['']
prevList = Permute(string[1:len(string)])
nextList = []
for i in range(0,len(prevList)):
for j in range(0,len(string)):
newString = prevList[i][0:j]+string[0]+prevList[i][j:len(string)-1]
if newString not in nextList:
nextList.append(newString)
return nextList
In order to get a list of all permutation strings, simply call the function above with your input string. 要获取所有排列字符串的列表,只需使用输入字符串调用上面的函数即可。 For example, 例如,
stringList = Permute('abc')
In order to get a single string of all permutation strings separated by new-line characters, simply call '\\n'.join
with the output of that function. 为了获得由换行符分隔的所有排列字符串的单个字符串,只需使用该函数的输出调用'\\n'.join
。 For example, 例如,
string = '\n'.join(Permute('abc'))
By the way, the print
results for the two options above are identical. 顺便说一句,上面两个选项的print
结果是相同的。
The result of permutations will be a collection, let's say a list. 排列的结果将是一个集合,让我们说一个列表。 It will make your code cleaner if you think this way and if required you can join the results into a single string. 如果您这样想,它将使您的代码更清晰,如果需要,您可以将结果加入到单个字符串中。 A simple example will be 一个简单的例子就是
def perms(s):
if(len(s)==1): return [s]
result=[]
for i,v in enumerate(s):
result += [v+p for p in perms(s[:i]+s[i+1:])]
return result
perms('abc')
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
print('\n'.join(perms('abc')))
abc
acb
bac
bca
cab
cba
Here is the code: 这是代码:
def fperms(elements):
if len(elements)<=1:
yield elements
else:
for p in fperms(elements[1:]):
for i in range(len(elements)):
yield p[:i]+elements[0:1]+p[i:]
Not sure about efficiency but this should work too. 不确定效率,但这也应该有效。
def find_permutations(v):
if len(v) > 1:
for i in perms(v):
nv = i[1:]
for j in perms(nv):
print(i[0] + j)
else:
print(v)
def perms(v):
if not hasattr(perms, 'original'):
perms.original = v
perms.list = []
nv = v[1:] + v[0]
perms.list.append(nv)
if perms.original == nv:
l = perms.list
del perms.original
del perms.list
return l
return perms(nv)
find_permutations('abc')
def get_permutations(sequence):
if len(sequence) == 1:
return [sequence] # base case
else:
result = []
for letter in sequence:
result += [letter +
other_letter for other_letter in get_permutations(sequence.replace(letter, ""))]
test_1 = 'abc'
print("Input: ", test_1)
print("Expected output: ", ['abc', 'acb', 'bac', 'bca', 'cab', 'cba'])
print("Actual output: ", get_permutations(test_1))
This kind of thing is a nice place for generators ( https://docs.python.org/3.3/tutorial/classes.html#generators ), and yield
. 这种东西对于生成器来说是个好地方( https://docs.python.org/3.3/tutorial/classes.html#generators )和yield
。
Try something like this (not tested): 尝试这样的事情(未经测试):
def permute_string(s):
if len(s) <= 1: # "" and 1 char strings are their all their own permutaions.
yield s
return
head = s[0] # we hold on to the first character
for tail in permute_string(s[1:]) : # permute the rest
yield head + tail
# main
for permutation in permute_string(s) :
print(permutation)
This is the classic permutation algorithm: you keep the first character and prepend it to all permutations of the remaining characters. 这是经典的排列算法:保留第一个字符并将其添加到剩余字符的所有排列中。 This particular function is a python generator: that means it can keep running while yielding its results one-by-one. 这个特殊的函数是一个python生成器:这意味着它可以继续运行,同时逐个产生结果。 In this case, it makes it easier to concentrate on the algorithm without worrying about the details of how to get the data back to the caller. 在这种情况下,它可以更容易地专注于算法,而不必担心如何将数据返回给调用者的细节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.