Все перестановки бинарной последовательности x бит длиной
Я хотел бы найти чистый и умный способ (в python), чтобы найти все перестановки строк длиной 1s и 0s x char. В идеале это было бы быстро и не требовало бы слишком много итераций...
Итак, для 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]
Ответы
Ответ 1
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']
Ответ 2
Нет необходимости быть слишком умным для чего-то такого простого:
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))
Ответ 3
Python 2.6 +:
['{0:0{width}b}'.format(v, width=x) for v in xrange(2**x)]
Ответ 4
Вы можете использовать itertools.product()
для этого.
import itertools
def binseq(k):
return [''.join(x) for x in itertools.product('01', repeat=k)]
Ответ 5
Престижность всех разумных решений передо мной. Вот низкоуровневый способ получить доступ к этим файлам:
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))
Это должно сделать трюк
Ответ 6
Функция itertools.product() генерирует только перестановки строк. Возможно ли это сделать для целых чисел? Я попытался назначить потом, но это не сработало.