максимальное количество комбинаций

Я пытаюсь создать список всех возможных числовых комбинаций в наборе из четырех чисел, используя все числа от 0 до 9.

Я приближаюсь, но на выходе не отображаются все возможные комбинации, начиная с 0000 и заканчивая 9999.

Есть какие-нибудь подсказки относительно того, почему следующий код отбрасывает определенные комбинации?

def permgen(items, n):
  if n==0: yield []
    else:
        for i in range(len(items)):
            for cc in permgen(items[:i]+items[i+1:],n-1):
                yield [items[i]]+cc

if __name__=="__main__":
    for c in permgen(['0','1','2','3','4','5','6','7','8','9'],4): print ''.join(c)

person Community    schedule 06.09.2009    source источник
comment
Может ли число появляться более одного раза? 1234 - это комбинация, отличная от 1243?   -  person Lennart Regebro    schedule 06.09.2009
comment
Да, это будут две отдельные комбинации.   -  person    schedule 06.09.2009


Ответы (4)


Эта строка:

for cc in permgen(items[:i]+items[i+1:],n-1):

Вы в основном говорите: «получите число, затем добавьте еще одно, отличное от ir, повторите n раз, затем верните список этих цифр. Это даст вам числа, в которых ни одна цифра не встречается более одного раза. . Если вы измените эту строку на:

for cc in permgen(items,n-1):

тогда вы получите все комбинации.

person varzan    schedule 06.09.2009

Если у вас установлен Python 2.6, почему бы не использовать itertools.combinations?

from itertools import combinations
combinations(range(10), 4)
person Nadia Alramli    schedule 06.09.2009

Взгляните на комбинаторные генераторы itertools:

>>> from itertools import combinations, permutations, product
>>> def pp(chunks):
...     print(' '.join(map(''.join, chunks)))
...
>>> pp(combinations('012', 2))
01 02 12
>>> pp(permutations('012', 2))
01 02 10 12 20 21
>>> pp(product('012', repeat=2))
00 01 02 10 11 12 20 21 22
>>> from itertools import combinations_with_replacement
>>> pp(combinations_with_replacement('012', 2))
00 01 02 11 12 22

combinations_with_replacement доступен в Python 3.1 (или 2.7).

Кажется, что itertools.product наиболее подходит для вашей задачи.

person jfs    schedule 06.09.2009

person    schedule
comment
У компилятора Python наверняка будет много работы с ЭТОМ кодом ... ;-) - person Alex Martelli; 06.09.2009