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

Mos*_*aly 4 python permutation python-itertools

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

p = itertools.permutations("0000111")
l = list(p)
print len(l) #5040
print len(set(l)) #35
Run Code Online (Sandbox Code Playgroud)

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

kay*_*kay 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.

完整的解决方案:

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

一点点解释:

  • (2**s for s in range(7)) 是2到2 ^ 6的所有幂的发电机.
  • itertools.combinations(…, 3) 查找具有3项这些2的幂的所有子集.
  • sum(subset)计算eg [1,2,4]= 7 的总和.
  • '{0:07b}'.format(…) 将输入int格式化为二进制数,用零填充,长度为7.