Эффективный способ создания набора кортежей, в котором порядок кортежа не имеет значения
Я хочу создать набор кортежей, в которых порядок кортежей не должен иметь значения. Например: если кортежи, которые я хочу добавить, это:
[(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, 2)
и (1, 2)
становятся равными после преобразования в set
. - Даже в том случае, когда мы рассматриваем кортежи длины 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)}