2010-09-29 23 views
7

que tienen una matriz 2-Deliminación de entradas duplicadas de matriz multi-d en el pitón

xx=[[a,1],[b,2],[c,3]] 

Ahora estoy tratando de eliminar las entradas duplicadas de la misma. Para una matriz 1-D simple, código simple como

xx=list(set(xx)) 

funcionaría. Pero tratar de establecer en los elementos 2-D da un error

temp = set(xx) 
TypeError: unhashable type: 'list' 

Una solución sería serializar elementos xx, y luego hacer una lista (set()) en la nueva matriz y luego unserialize todos los elementos de nuevo.

¿Hay alguna solución en python?

Respuesta

16

Convierte elementos a tupla y luego usa set.

>>> xx=[['a',1],['b',2],['c',3],['c',3]] 
>>> set(tuple(element) for element in xx) 
set([('a', 1), ('b', 2), ('c', 3)]) 
>>> 

Tuplas, a diferencia de las listas, pueden ser hash. Por lo tanto. Y una vez que haya terminado, convierta los elementos nuevamente a la lista. Poniendo todo junto:

>>> [list(t) for t in set(tuple(element) for element in xx)] 
[['a', 1], ['b', 2], ['c', 3]] 
+0

de alguna manera el código no pudo eliminar las entradas duplicadas. set() no puede detectar tuplas duplicadas? – Neo

+0

@Neo: Esto se pone interesante. ¿Puedes publicar algunos valores de muestra? –

+0

cadena y cantidad del mismo valor o casi los mismos números en coma flotante ¿quizás? –

3

Un año después de la excelente respuesta de Manoj Govindan, estoy añadiendo mi consejo:

flotantes números de puntos son sólo un dolor si se desea comparar las cosas ...

Por ejemplo,

>>> + 0,1 + 0,1 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 + 0,1 == 0,1 * 10

Falso

Eso es porque el equipo no puede representar con precisión los puntos flotantes decimales como números binarios (ordenadores manejan base binaria/2 números solamente, no se admiten decimales/base 10).

¡Tenga mucho cuidado al comparar flotadores!

Cuestiones relacionadas