Комбинации Python без повторения - Pyncomb? - PullRequest
6 голосов
/ 05 июня 2011

Я пытаюсь сделать некоторые комбинаторные вещи с данными в Python.Я посмотрел вопрос Как сгенерировать все перестановки списка в Python , но думаю, что это не соответствует моим потребностям ... У меня есть данные этого типа ...:

    group1-Steve
    group1-Mark
    group1-Tom
    group2-Brett
    group2-Mick
    group2-Foo
    group3-Dan
    group3-Phil

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

Я знаю, что в этом случае существует 18 возможных различных комбинаций (3 * 3 * 2 = 18), но я не знаю, как мне написать этот код.Я читал о пакете Pyncomb, но не знаю, какую функцию применять в этом случае;может быть, есть функция, которая выполняет эту работу.

Надеюсь, кто-нибудь может мне помочь ...

Заранее спасибо;

Peixe

Ответы [ 2 ]

9 голосов
/ 05 июня 2011

Самый простой способ - использовать itertools.product():

group1 = ["Steve", "Mark", "Tom"]
group2 = ["Brett", "Mick", "Foo"]
group3 = ["Dan", "Phil"]
for x in itertools.product(group1, group2, group3):
    print x

отпечатки

('Steve', 'Brett', 'Dan')
('Steve', 'Brett', 'Phil')
('Steve', 'Mick', 'Dan')
('Steve', 'Mick', 'Phil')
('Steve', 'Foo', 'Dan')
('Steve', 'Foo', 'Phil')
('Mark', 'Brett', 'Dan')
('Mark', 'Brett', 'Phil')
('Mark', 'Mick', 'Dan')
('Mark', 'Mick', 'Phil')
('Mark', 'Foo', 'Dan')
('Mark', 'Foo', 'Phil')
('Tom', 'Brett', 'Dan')
('Tom', 'Brett', 'Phil')
('Tom', 'Mick', 'Dan')
('Tom', 'Mick', 'Phil')
('Tom', 'Foo', 'Dan')
('Tom', 'Foo', 'Phil')
4 голосов
/ 05 июня 2011

Еще одна альтернатива, которая позволяет избежать импорта, - это использование понимания списка:

[(a, b, c) for a in group1 for b in group2 for c in group3]

Это дает тот же результат, что и у Свена, но хорошо, если вы тоже хотите выполнить некоторую фильтрацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...