У меня была аналогичная проблема, и я нашел решение здесь . Он работает без необходимости импорта какого-либо модуля.
Допустим, список вроде:
people = ["Lisa","Pam","Phil","John"]
Упрощенное однострочное решение могло бы выглядеть так.
Все возможные пары , включая дубликаты:
result = [foo(p1, p2) for p1 in people for p2 in people]
Все возможные пары, исключая дубликаты :
result = [foo(p1, p2) for p1 in people for p2 in people if p1 != p2]
Уникальные пары , порядок которых не имеет значения:
result = [foo(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Если вы не хотите работать, а просто хотите получить пары, достаточно будет удалить функцию fooи использовать только кортеж.
Все возможные пары , включая дубликаты:
list_of_pairs = [(p1, p2) for p1 in people for p2 in people]
Результат:
('Lisa', 'Lisa')
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Pam')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'Phil')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
('John', 'John')
Все возможные пары, исключая дубликаты :
list_of_pairs = [(p1, p2) for p1 in people for p2 in people if p1 != p2]
Результат:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
Уникальные пары , порядок которых не имеет значения:
list_of_pairs = [(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Результат:
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'John')
Изменить: после переделки, чтобы упростить это решение, я понял, что это тот же подход, что и у Адама Розенфилда. Я надеюсь, что более подробное объяснение поможет некоторым лучше понять это.