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