генерация всех перестановок из 2 единиц и 3 нулей с помощью itertools - PullRequest
2 голосов
/ 17 февраля 2012

, вероятно, простой, но не смог найти его ни в одном другом вопросе. Я попробовал:

print ["".join(seq) for seq in itertools.permutations("00011")]

но получил много дубликатов, похоже, что itertools не понимает все нули и все они одинаковы ...

что мне не хватает?

EDIT:

упс. Благодаря Гарету я обнаружил, что этот вопрос дублирует: перестановок с уникальными значениями . Не закрывая его, я думаю, что моя формулировка вопроса яснее.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012
list(itertools.combinations(range(5), 2))

возвращает список из 10 позиций, где две могут быть в пределах пяти цифр (остальные равны нулю):

[(0, 1),
 (0, 2),
 (0, 3),
 (0, 4),
 (1, 2),
 (1, 3),
 (1, 4),
 (2, 3),
 (2, 4),
 (3, 4)]

Для вашего случая с 2 единицами и 13 нулями используйте это:

list(itertools.combinations(range(5), 2))

, который возвращает список из 105 позиций. И это намного быстрее, чем ваше оригинальное решение.

Теперь функция:

def combiner(zeros=3, ones=2):
    for indices in itertools.combinations(range(zeros+ones), ones):
        item = ['0'] * (zeros+ones)
        for index in indices:
            item[index] = '1'
        yield ''.join(item)

print list(combiner(3, 2))

['11000',
 '01100',
 '01010',
 '01001',
 '00101',
 '00110',
 '10001',
 '10010',
 '00011',
 '10100']

и для этого нужно 14,4 мкс.

list(combiner(13, 2))

для возврата 105 элементов требуется 134 мкс.

2 голосов
/ 17 февраля 2012
set("".join(seq) for seq in itertools.permutations("00011"))
...