Существует ли функция Python, которая находит все порядки длины k в списке? - PullRequest
2 голосов
/ 19 марта 2020

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

Учитывая некоторый список:

list1 = ['a', 'b']

Есть ли функция, которая возвращает следующий набор?

output = {('a', 'b'), ('a', 'a'), ('b', 'b'), ('b', 'a')}

Мне удалось сгенерируйте желаемый результат, используя функции itertools combinations_with_replacement и permutations, следующим образом:

from itertools import combinations_with_replacement, permutations
set1 = set(combinations_with_replacement(['a', 'b'], 2))
set2 = set(permutations(['a', 'b'], 2))

>>> set1
{('a', 'b'), ('a', 'a'), ('b', 'b')}
>>> set2
{('b', 'a'), ('a', 'b')}

set1.update(set2)

>>> set1
{('a', 'b'), ('a', 'a'), ('b', 'b'), ('b', 'a')}

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

Ответы [ 2 ]

5 голосов
/ 19 марта 2020

Вы хотите itertools.product:

>>> import itertools
>>> set(itertools.product(list1, repeat=2))
{('a', 'b'), ('b', 'a'), ('b', 'b'), ('a', 'a')}

itertools.product с параметром repeat, по сути, "permutations_with_replacement", что, по-видимому, является тем, что вы хотите.

2 голосов
/ 19 марта 2020

Itertools.product () делает то, что вы хотите:

mylist = ['a', 'b']
list(itertools.product(mylist, repeat=2))

Out[8]: [('a', 'a'), ('a', 'b'), ('b', 'a'), ('b', 'b')]
...