2010-09-29 2 views
2

У меня есть список с длиной N, и каждый элемент этого списка равен 0 или 1. Мне нужно получить все возможные комбинации этого списка. Вот мой код:Список комбинаций

def some(lst): 
    result = [] 
    for element in lst: 
     c1 = copy.copy(element) 
     c2 = copy.copy(element) 
     c1.append(0) 
     c2.append(1) 
     result.append(c1)   
     result.append(c2) 
    return result 

def generate(n): 
    if(n == 1): 
     return [[0], [1]] 
    else: 
     return some(generate(n - 1))  

print generate(4) 

Я думаю, что есть более pythonic решение этой задачи. Спасибо заранее.

ответ

5

Не выглядят ли битовые паттерны (0000 .... 1111) биты двоичных разрядов. И все возможные комбинации п двоичных разрядов в диапазоне от 0 до 2 ** п -1

noOfBits = 5 
for n in range(2**noOfBits): 
    binVal = bin(n)[2:].zfill(noOfBits) 
    b = [ x for x in binVal] 
    print b 

Нужно ли нам комбинаторика для этой цели?

Выход:

['0', '0', '0', '0', '0'] 
['0', '0', '0', '0', '1'] 
['0', '0', '0', '1', '0'] 
['0', '0', '0', '1', '1'] 
['0', '0', '1', '0', '0'] 
['0', '0', '1', '0', '1'] 
....... 
+1

Небольшая коррекция: изменить 'диапазон (0, 2 ** noOfBits -1)' to 'range (2 ** noOfBits)'. –

+0

@Sheldon L. Cooper: +1 Большое спасибо, я отредактирую свой ответ, чтобы исправить это – pyfunc

+0

Спасибо. Это все, что мне нужно. – demas

3

Модуль itertools имеет готовые генераторы для многих комбинаторных задач. Для вашей задачи:

list(itertools.product(*noOfBits * ((0, 1),))) 
Смежные вопросы