Как сгладить большие петли стеков? - PullRequest
2 голосов
/ 10 февраля 2012

Допустим, я хотел получить все возможные комбинации трех двоичных цифр, то есть:

0,0,0
0,0,1
0,1,0
0,1,1
1,0,0
1,0,1
1,1,0
1,1,1

Я мог бы сделать что-то вроде этого:

p = []
for a in range(2):
    for b in range(2):
        for c in range(2):
           p.append([a,b,c])

print p

Но что, если я хотелопределить функцию, которая возвращает возможности для n чисел двоичных цифр?т.е. как я могу динамически составлять циклы for?

Ответы [ 4 ]

5 голосов
/ 10 февраля 2012
from itertools import product
product(range(2), repeat=3)
4 голосов
/ 10 февраля 2012

Взгляните на itertools.product.

2 голосов
/ 10 февраля 2012

Вам действительно нужен только один цикл для вашего конкретного случая, поскольку требуемая последовательность нулей и единиц представляет последовательные целые числа:

def allbinary(ndigits):
    for n in xrange(2 ** ndigits):
        yield map(int, bin(n)[2:].zfill(ndigits))

for x in allbinary(8): print x

Обратите внимание, что map() создает список, а не кортеж, но вы можете просто преобразовать его в кортеж, если вам это необходимо.

Тем не менее, itertools.product, как рекомендовано другими, является лучшим решением в большинстве случаев, включая этот.

2 голосов
/ 10 февраля 2012

Нет itertools решение.

def binarydigits(n):
    if n == 1:
        yield (0,)
        yield (1,)
    else:
        for i in binarydigits(n-1):
            for j in binarydigits(1):
                yield i+j
...