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

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

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

Он должен выводиться следующим образом:

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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