使用itertools.permutation计算排列时出现意外结果

时间:2012-02-12 15:20:17

标签: python python-2.7

给定字符串为'0123456789'。 我想产生其百万分之一的排列(1000000)。

我想先试试itertools.permutations

In [85]: import itertools

In [86]: a = list(itertools.permutations('0123456789'))

In [87]: a[1]
Out[87]: ('0', '1', '2', '3', '4', '5', '6', '7', '9', '8')

In [88]: a[1000000]
Out[88]: ('2', '7', '8', '3', '9', '1', '5', '6', '0', '4')

但是,如果我运行以下代码:

def perm(S, perms=[], current=[], maximum=None):
    if maximum and len(perms) > maximum:
        return
    size = len(S)
    for i in range(size):
        subset = list(S)
        del(subset[i])
        tmp_current = list(current)
        tmp_current.append(S[i])
        if size > 1:
            perm(subset, perms, tmp_current, maximum)

        else:
            perms.append(tmp_current)
            if maximum:
                if len(perms) == maximum:
                    print tmp_current
                    return

perm('0123456789', maximum=1000000)

# the result is ['2', '7', '8', '3', '9', '1', '5', '4', '6', '0']

来自itertools.permutations和上述伪代码的答案不匹配。

[2783915604] from itertools
[2783915460] from the snippet above

第二个答案是正确答案。有人可以解释一下为什么第一个过程没有产生正确的结果吗?

1 个答案:

答案 0 :(得分:2)

你搞砸了索引:

>>> a[999999]
('2', '7', '8', '3', '9', '1', '5', '4', '6', '0')

生成1m结果时,代码退出。列表中的1m元素具有索引999999