python - tuplas - Manera eficiente de hacer un conjunto de tupla en la que el orden de la tupla no importa
tupla en base de datos (4)
Quiero hacer un conjunto de tuplas en las que el orden de las tuplas no debería importar. Por ejemplo: si las tuplas que quiero agregar son:
[(1,2),(1,3),(2,1)]
Debe salir así:
{(1,2),(1,3)}
¿Hay alguna forma eficiente de hacer esto en python?
¡El otro responde todo el trabajo! Solo voy a publicar el mío aquí porque soy un principiante y me encanta practicar.
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)
Devuelve
{(1, 2), (1, 3)}
¡Si quieres usar esto o no depende de ti! Las otras respuestas son mucho más cortas.
Puede aplicar sorted
y luego tuple
, seguido de la conversión para set
:
res = set(map(tuple, map(sorted, L)))
print(res)
{(1, 2), (1, 3)}
Explicación
Hay un par de buenas razones por las que no debe convertir cada tupla para set
como paso inicial:
- Las tuplas
(1, 1, 2)
y(1, 2)
serían iguales después de la conversión aset
. - Incluso en el caso de que estemos considerando tuplas de longitud 2, estaríamos agregando un supuesto de que
tuple({(1, 2)})
ytuple({(2, 1)})
son iguales. Si bien esto puede ser cierto, se consideraría un detalle de la implementación, yaset
se considera que elset
está ordenado.
Composición de la función
La composición de la función no es nativa de Python, pero si tiene acceso a la biblioteca de toolz
terceros, puede evitar el map
anidado:
from toolz import compose
tup_sort = compose(tuple, sorted)
res = set(map(tup_sort, L))
Puedes ordenar las tuplas:
l = [(1,2),(1,3),(2,1)]
res = set(map(lambda x: tuple(sorted(x)), l))
print(res)
{(1, 2), (1, 3)}
Puedes usar la comprensión, también:
l=[(1, 2), (1, 3), (2, 1)]
res={ tuple(sorted(t)) for t in l }
print(res)
{(1, 2), (1, 3)}