为什么python的itertools排列有很多重复的元素?

时间:2013-11-26 23:44:42

标签: python permutation itertools

我试图找到字符串“0000111”的不同排列。所有不同的字符串包含三个1和4个0。这是我的代码:

p = itertools.permutations("0000111")
l = list(p)
print len(l) #5040
print len(set(l)) #35

怎么了?还有更好的方法吗?

1 个答案:

答案 0 :(得分:8)

它在手册中:http://docs.python.org/2.7/library/itertools.html#itertools.permutations

  

元素根据其位置而不是其价值被视为唯一。因此,如果输入元素是唯一的,则每个排列中都不会有重复值。

这意味着itertools.permutations('000')会很乐意给你3个! = 6个结果,其中全部为'000'

亲眼看看:http://ideone.com/gzqolT


如果您将问题解释为位图,则可以解决您的问题。 itertools.combinations(S,r)为您提供Sr项的所有子集。在您的示例中S = range(7)r = 3

A full working solution

list('{0:07b}'.format(sum(subset))
     for subset in itertools.combinations((2**s for s in range(7)), 3))

一点点解释:

  • (2**s for s in range(7))是2到2 ^ 6的所有幂的生成器。
  • itertools.combinations(…, 3)查找包含3项这些2项权力的子集。
  • sum(subset)计算例如: [1,2,4] = 7。
  • '{0:07b}'.format(…)将输入int格式化为二进制数,用零填充,长度为7。