我在教自己Python。我从字符串中看到了一个java排列生成器,我想我使用java版本并自己编写Python版本。
以下是我用Python编写的内容:
a = "abc"
a = list(a)
def swap(i,j):
c = a[i]
a[i] = a[j]
a[j] = c
def perm2(n):
if n == 1:
print a
else:
for i in range(len(a)):
swap(i, n-1)
perm2(n-1)
swap(i, n-1)
perm2(len(a))
当我运行时,我得到以下内容:
['b', 'c', 'a']
['c', 'b', 'a']
['c', 'a', 'b']
['c', 'a', 'b']
['a', 'c', 'b']
['a', 'b', 'c']
['b', 'a', 'c']
['a', 'b', 'c']
['a', 'c', 'b']
现在,输出确实包含所有排列,但它也包含重复项。然而,java版本没有。
导致此问题的原因是什么?
修改
顺便说一下,我知道我可以在一条线上研究和找到为我做这个的工具等等...但我的目标是了解这个问题的原因,以便答案有希望在将来帮助我。核心理解对我很重要。
答案 0 :(得分:4)
用n:
更改len(a)def perm2(n):
if n == 1:
print a
else:
for i in range(n): # << here
swap(i, n-1)
perm2(n-1)
swap(i, n-1)
结果:
['b', 'c', 'a']
['c', 'b', 'a']
['c', 'a', 'b']
['a', 'c', 'b']
['b', 'a', 'c']
['a', 'b', 'c']
答案 1 :(得分:1)
我建议你使用itertools
>>> import itertools
>>> for perm in itertools.permutations("abc"):
print perm
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')