Как насчет itertools.combination ?
Пример использования:
>>> list(itertools.combinations([1, 2, 3, 4, 5, 6], 2))
[(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 3), (2, 4), (2, 5), (2, 6), (3, 4),
(3, 5), (3, 6), (4, 5), (4, 6), (5, 6)]
Первый аргумент является итеративным, второй - r
, длина возвращаемых подпоследовательностей.
Затем можно с легкостью объединить результаты, используя карту или понимание:
map(lambda x: x[0] + "_" + x[1], itertools.combinations(["cat", "dog", "fish"], 2)))
x
в лямбда-выражении - это кортеж r
.
Результатом вышесказанного будет:
['cat_dog', 'cat_fish', 'dog_fish']