все перестановки двоичной последовательности длиной x бит - PullRequest
24 голосов
/ 08 февраля 2011

Я хотел бы найти чистый и умный способ (в python) найти все перестановки строк длиной 1 с и 0 с х символов.В идеале это было бы быстро и не требовало бы выполнения слишком большого количества итераций ...

Итак, для x = 1 я хочу: ['0', '1'] x = 2 ['00', '01', '10 ',' 11 ']

и т.д ..

Прямо сейчас у меня есть это, которое медленно и кажется не элегантным:

    self.nbits = n
    items = []
    for x in xrange(n+1):
        ones = x
        zeros = n-x
        item = []
        for i in xrange(ones):
            item.append(1)
        for i in xrange(zeros):
            item.append(0)
        items.append(item)
    perms = set()
    for item in items:
        for perm in itertools.permutations(item):
            perms.add(perm)
    perms = list(perms)
    perms.sort()
    self.to_bits = {}
    self.to_code = {}
    for x in enumerate(perms):
        self.to_bits[x[0]] = ''.join([str(y) for y in x[1]])
        self.to_code[''.join([str(y) for y in x[1]])] = x[0]

Ответы [ 5 ]

58 голосов
/ 08 февраля 2011

itertools.product сделано для этого:

>>> import itertools
>>> ["".join(seq) for seq in itertools.product("01", repeat=2)]
['00', '01', '10', '11']
>>> ["".join(seq) for seq in itertools.product("01", repeat=3)]
['000', '001', '010', '011', '100', '101', '110', '111']
6 голосов
/ 08 февраля 2011

Нет необходимости быть слишком умным для чего-то такого простого:

def perms(n):
    if not n:
        return

    for i in xrange(2**n):
        s = bin(i)[2:]
        s = "0" * (n-len(s)) + s
        yield s

print list(perms(5))
5 голосов
/ 08 февраля 2011

Python 2.6 +:

['{0:0{width}b}'.format(v, width=x) for v in xrange(2**x)]
5 голосов
/ 08 февраля 2011

Вы можете использовать itertools.product() для этого.

import itertools
def binseq(k):
    return [''.join(x) for x in itertools.product('01', repeat=k)]
2 голосов
/ 08 февраля 2011

Слава всем умным решениям до меня.Вот низкоуровневый, грязный способ сделать это:

def dec2bin(n):
    if not n:
        return ''
    else:
        return dec2bin(n/2) + str(n%2)

def pad(p, s):
    return "0"*(p-len(s))+s

def combos(n):
    for i in range(2**n):
        print pad(n, dec2bin(i))

Это должно сработать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...