Python: Generar un “conjunto de tuplas” a partir de una “lista de tuplas” que no tiene en cuenta el orden

Si tengo la lista de tuplas como sigue:

[('a', 'b'), ('c', 'd'), ('a', 'b'), ('b', 'a')] 

Me gustaría eliminar las tuplas duplicadas (duplicadas en términos de contenido y orden de elementos dentro) para que la salida sea:

 [('a', 'b'), ('c', 'd')] 

O

 [('b', 'a'), ('c', 'd')] 

Intenté convertirlo en set luego en list, pero la salida mantendría tanto ('b', 'a') como ('a', 'b') en el conjunto resultante.

Prueba esto :

 a = [('a', 'b'), ('c', 'd'), ('a', 'b'), ('b', 'a')] b = list(set([ tuple(sorted(t)) for t in a ])) [('a', 'b'), ('c', 'd')] 

Vamos a desglosar esto:

Si ordena una tupla, se convierte en una lista ordenada.

 >>> t = ('b', 'a') >>> sorted(t) ['a', 'b'] 

Para cada tupla t en a , clasifíquela y conviértala de nuevo en una tupla.

 >>> b = [ tuple(sorted(t)) for t in a ] >>> b [('a', 'b'), ('c', 'd'), ('a', 'b'), ('a', 'b')] 

Convierta la lista resultante b en un conjunto: los valores ahora son únicos. Convertirlo de nuevo a una lista.

 >>> list(set(b)) [('a', 'b'), ('c', 'd')] 

Et voilà!

Tenga en cuenta que puede omitir la creación de la lista intermedia b utilizando un generador en lugar de una comprensión de lista .

 >>> list(set(tuple(sorted(t)) for t in a)) [('a', 'b'), ('c', 'd')] 

Si no te importó usar un frozenset con un set:

 l = [('a', 'b'), ('c', 'd'), ('a', 'b'), ('b', 'a')] print(set(map(frozenset,l))) {frozenset({'a', 'b'}), frozenset({'c', 'd'})} 

Puede convertir de nuevo a tupla si es preferible:

 l = [('a', 'b'), ('c', 'd'), ('a', 'b'), ('b', 'a')] print(list(map(tuple,set(map(frozenset ,l))))) [('a', 'b'), ('d', 'c')] 

O usando un set y revertir el orden de las tuplas:

 l = [('a', 'b'), ('c', 'd'), ('a', 'b'), ('b', 'a')] seen, pairs = set(), [] for a,b in l: if (a,b) not in seen and (b,a) not in seen: pairs.append((a,b)) seen.add((a,b)) 

Esto puede resolver su problema si el orden no es importante.

 a=[('a', 'b'), ('c', 'd'), ('a', 'b'), ('b', 'a')] a=map(tuple,[sorted(i) for i in a]) print list(set(a)) 

Salida:

 [('a', 'b'), ('c', 'd')] 

Tipos incorporados al rescate:

 data = [('a', 'b'), ('c', 'd'), ('a', 'b'), ('b', 'a')] set(map(frozenset, data)) {frozenset({'a', 'b'}), frozenset({'c', 'd'})}