查找列表二进制值的唯一排列,而不会产生所有可能性

时间:2016-06-02 04:40:06

标签: python permutation

原谅我的无知。我目前有一个脑屁,无法找到解决方案。假设我有一个[1, 1, 0, 0]列表。我想计算所有四位二进制数,它们恰好有两个1和两个零,如:

['0110', '0011', '0101', '1100', '1010', '1001']

这有效:

from itertools import permutations

set([''.join(x) for x in list(permutations('0011', 4))])

但是这会计算整个排列,然后丢弃副本。意思是,它计算了24次但我只需要6次。如果集合是[1, 1, 1, 1, 0, 0, 0, 0]则更为重要。

这应该很容易,但我无法绕过它。

2 个答案:

答案 0 :(得分:5)

使用itertools.combinations()查找所有可能的位置,然后使用这些位置构建数字:

def binary(length=4, ones=2):
    result = []
    for positions in combinations(range(length), ones):
        result.append("".join("1" if _ in positions else "0" for _ in range(length)))
    return result

结果:

In [9]: binary()
Out[9]: ['1100', '1010', '1001', '0110', '0101', '0011']

In [10]: binary(5)
Out[10]:
['11000', '10100', '10010', '10001', '01100', '01010', '01001', '00110', '00101', '00011']

In [11]: binary(4,1)
Out[11]: ['1000', '0100', '0010', '0001']

In [12]: binary(4,4)
Out[12]: ['1111']

答案 1 :(得分:3)

这篇文章有点晚了。
@Tim Pietzcker的答案非常好,但内部循环中的一个内循环对我来说很难消化;

所以我用简单的方式写它,它的速度提高了4-7倍。

def binary(length=4, ones=2):
    result = []
    rr = ['0'] * length  ## initialize empty list with ZEROS of given length
    for c in itertools.combinations(range(length), ones):
        r = rr[:] ## create a copy of initialized list
        for x in c:
            r[x] = '1' ## Change ZERO to ONE based on different combinations of positions 
        result.append("".join(r))
    return result