Перестановки Itertools

У меня есть список, скажем, x=[1,2,3,4,5] и я хочу посмотреть на разные перестановки этого списка, взятые по два числа за раз.

x=[1,2,3,4,5] 
from itertools import permutations
y=list(i for i in permutations(x,2) if i[0]<i[1])
print(y)

вывод: [(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]

Но я также хочу, чтобы на выходе было [(1,1),(2,2),(3,3),(4,4),(5,5)]. Как это исправить?


person Demonking28    schedule 05.11.2017    source источник
comment
Я надеюсь, вы можете добавить их сами, не так ли?   -  person Miraj50    schedule 05.11.2017
comment
Не используйте list(<genexpr>). Просто используйте понимание списка (замените list(...) на [...]).   -  person Martijn Pieters    schedule 05.11.2017
comment
@ Miraj50 Это только часть вопроса. В списке может быть любое количество значений.   -  person Demonking28    schedule 05.11.2017
comment
Да, так что после этого сделайте y.extend([(i,i) for i in x]).   -  person Miraj50    schedule 05.11.2017
comment
Итак, вы хотите иметь комбинации с повторами? Вам действительно нужны уникальные наборы продуктов x?   -  person Martijn Pieters    schedule 05.11.2017
comment
как насчет list(i for i in itertools.combinations_with_replacement(x,2) if i[0]<=i[1])   -  person Jean-François Fabre    schedule 05.11.2017
comment
@Jean-FrançoisFabre: вам вообще не нужен фильтр if; для возрастающей серии x других кортежей не будет.   -  person Martijn Pieters    schedule 05.11.2017


Ответы (1)


Вместо этого вам нужно combinations_with_replacement():

>>> from itertools import combinations_with_replacement
>>> list(combinations_with_replacement(x, 2))
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 2), (2, 3), (2, 4), (2, 5), (3, 3), (3, 4), (3, 5), (4, 4), (4, 5), (5, 5)]
person Martijn Pieters    schedule 05.11.2017