it-swarm.com.ru

Эффективный способ создания набора Tuple, в котором порядок Tuple не имеет значения

Я хочу создать набор кортежей, в котором порядок кортежей не должен иметь значения Например. Если я хочу добавить кортежи:

[(1,2),(1,3),(2,1)]

Это должно вывести как это:

{(1,2),(1,3)}

Есть ли эффективный способ сделать это в Python?

17
shivank01

Вы можете применить sorted и затем Tuple с последующим преобразованием в set:

res = set(map(Tuple, map(sorted, L)))

print(res)

{(1, 2), (1, 3)}

Объяснение

Есть несколько веских причин, по которым вам не следует преобразовывать каждый кортеж в set в качестве начального шага:

  1. Кортежи (1, 1, 2) и (1, 2) станут равными после преобразования в set.
  2. Даже в случае, когда мы рассматриваем кортежи длины 2, мы добавим предположение, что Tuple({(1, 2)}) и Tuple({(2, 1)}) равны. Хотя это может быть правдой, это будет считаться деталями реализации, поскольку set считается неупорядоченным.

Состав функции

Композиция функций не является родной для Python, но если у вас есть доступ к сторонней библиотеке toolz , вы можете избежать вложенной map:

from toolz import compose

tup_sort = compose(Tuple, sorted)

res = set(map(tup_sort, L))
11
jpp

Вы можете отсортировать кортежи:

l = [(1,2),(1,3),(2,1)]
res = set(map(lambda x: Tuple(sorted(x)), l))
print(res)
{(1, 2), (1, 3)}
2
Netwave

Остальные ответы все работают! Я просто собираюсь опубликовать мой здесь, потому что я новичок, и я люблю практиковать. 

mainSet = set()
l = [(1,2),(1,3),(2,1)]

for i in l:

    if Tuple(sorted(i)) not in mainSet:

        mainSet.add(Tuple(sorted(i)))

print(mainSet)

Отдает

{(1, 2), (1, 3)}

Хотите ли вы использовать это или нет, зависит от вас! Другие ответы намного короче.

1
Abhishek

Вы также можете использовать понимание:

l=[(1, 2), (1, 3), (2, 1)]
res={ Tuple(sorted(t)) for t in l }
print(res)
{(1, 2), (1, 3)}
0
kantal