Python - 使用itertools生成二进制列表

时间:2014-01-31 21:18:51

标签: python list binary itertools

我想生成以下输出:

[11000]所有这些数字的组合,但没有双打

   [11000]
   [01100]
   [00110]
   [00011]
   [10100]
   .
   .
   .

但我无法弄清楚如何做到这一点。在我的问题中,列表有365个值,大约有20个。

3 个答案:

答案 0 :(得分:1)

您可以使用itertools.permutations()

for item in itertools.permutations('11000'):
    print ''.join(item)

答案 1 :(得分:0)

您可以检查您是否只获得唯一字符串:

from itertools import filterfalse, permutations # ifilterfalse in 2.x  

def unique_permutations(s):
    seen = set()
    for p in filterfalse(seen.__contains__, permutations(s)):
        seen.add(p)
        yield "".join(p)

我得到了len(s) == 5的10个输出值:

['11000', '10100', '10010', '10001', '01100', 
 '01010', '01001', '00110', '00101', '00011']

生成器比预先构建列表更有效率,它只需要join它所需的内容,但你仍然会放弃很多排列。

答案 2 :(得分:0)

你有365个可能的位置来放置20个。因此,解决这个问题的一种方法是制作365个职位的所有20个长度组合。

代码中的外观示例:

from itertools import combinations

n = 365
r = 20

for indexes in combinations(range(n), r):
    base = [0]*n
    for i in indexes:
        base[i] = 1
    print(base)

由于这是一个“n选择r”问题,你将有很多可能的组合!要计算多少,请使用:n! /(r!(n-r)!)= 365! /(20!(365-20)!)= 426112827338828179808453831565930。