Список комбинаций - PullRequest
       10

Список комбинаций

2 голосов
/ 29 сентября 2010

У меня есть список с длиной 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)

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

Ответы [ 2 ]

5 голосов
/ 29 сентября 2010

Разве они не выглядят как битовые комбинации (0000 .... 1111), то есть двоичные биты.И все возможные комбинации n двоичных битов будут варьироваться от 0 до 2 ** n -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']
.......
3 голосов
/ 29 сентября 2010

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

list(itertools.product(*noOfBits * ((0, 1),)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...