我试图找到字符串“0000111”的不同排列。所有不同的字符串包含三个1和4个0。这是我的代码:
p = itertools.permutations("0000111")
l = list(p)
print len(l) #5040
print len(set(l)) #35
怎么了?还有更好的方法吗?
答案 0 :(得分:8)
它在手册中:http://docs.python.org/2.7/library/itertools.html#itertools.permutations
元素根据其位置而不是其价值被视为唯一。因此,如果输入元素是唯一的,则每个排列中都不会有重复值。
这意味着itertools.permutations('000')
会很乐意给你3个! = 6个结果,其中全部为'000'
。
如果您将问题解释为位图,则可以解决您的问题。 itertools.combinations(S,r)
为您提供S
个r
项的所有子集。在您的示例中S = range(7)
和r = 3
。
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。