Эффективный способ создания набора кортежей, в котором порядок кортежей не имеет значения - PullRequest
0 голосов
/ 28 июня 2018

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

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

Должно получиться так:

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

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

Ответы [ 4 ]

0 голосов
/ 01 июля 2018

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

l=[(1, 2), (1, 3), (2, 1)]
res={ tuple(sorted(t)) for t in l }
print(res)
{(1, 2), (1, 3)}
0 голосов
/ 28 июня 2018

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

l = [(1,2),(1,3),(2,1)]
res = set(map(lambda x: tuple(sorted(x)), l))
print(res)
{(1, 2), (1, 3)}
0 голосов
/ 28 июня 2018

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

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)}

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

0 голосов
/ 28 июня 2018

Вы можете применить 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))
...