学习Python - 排列错误

时间:2011-01-15 11:52:40

标签: python

我在教自己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版本没有。

导致此问题的原因是什么?

修改

顺便说一下,我知道我可以在一条线上研究和找到为我做这个的工具等等...但我的目标是了解这个问题的原因,以便答案有希望在将来帮助我。核心理解对我很重要。

2 个答案:

答案 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')