2010-09-16 12 views
23

Tengo curiosidad por lo que sería una manera Effient de uniquefying dichos objetos de datos:Python: Singularidad de lista de listas

testdata =[ ['9034968', 'ETH'], ['14160113', 'ETH'], ['9034968', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15724032', 'ETH'], ['15481740', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['10307528', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['15481740', 'ETH'], ['15379365', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15379365', 'ETH'] 
] 

Para cada par de datos, cadena numérica izquierdo como al tipo de la derecha indica la singularidad de un elemento de datos. Y devuelve una lista de listas igual que los testdata, pero solo existen únicos.

Saludos

Respuesta

51

Puede utilizar un conjunto:

unique_data = [list(x) for x in set(tuple(x) for x in testdata)] 

También puede ver this page el que los puntos de referencia una variedad de métodos que preserven ya sea o no conservan la orden.

+0

Tenga en cuenta que pierde el orden con este método. Si es relevante, tendrá que ordenarlo o eliminar los elementos manualmente. – Wolph

+1

Me aparece un error: 'TypeError: tipo de ajuste: 'list''. Python 2.6.2, Ubuntu Jaunty. –

+0

@Hellnar: acaba de actualizar el código para usar una tupla, ahora ya no tendrás ese problema :) – Wolph

5

Intenté la respuesta de @ Mark y obtuve un error. Convertir la lista y cada elemento en una tupla lo hizo funcionar. No estoy seguro si esta es la mejor manera.

list(map(list, set(map(lambda i: tuple(i), testdata)))) 

Por supuesto, lo mismo se puede expresar utilizando una lista de comprensión en su lugar.

[list(i) for i in set(tuple(i) for i in testdata)] 

Estoy usando Python 2.6.2.

actualización

@ Marcos ha cambiado desde su respuesta. Su respuesta actual usa tuplas y funcionará. Lo mismo ocurrirá con la mía :)

Actualización 2

Gracias a @ Marcos. He cambiado mi respuesta para devolver una lista de listas en lugar de una lista de tuplas.

+0

@Mark: hecho. ¡Gracias! –

+0

Aquí hay un pequeño truco: en lugar de 'lambda x: foo (x)' puedes simplemente escribir 'foo'. –

+0

@Mark: Donde 'foo' es un invocable. Gotcha. –

1
import sets 
testdata =[ ['9034968', 'ETH'], ['14160113', 'ETH'], ['9034968', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15724032', 'ETH'], ['15481740', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['10307528', 'ETH'], ['15481757', 'ETH'], ['15481724', 'ETH'], ['15481740', 'ETH'], ['15379365', 'ETH'], ['11111', 'NOT'], ['9555269', 'NOT'], ['15379365', 'ETH']] 
conacatData = [x[0] + x[1] for x in testdata] 
print conacatData 
uniqueSet = sets.Set(conacatData) 
uniqueList = [ [t[0:-3], t[-3:]] for t in uniqueSet] 
print uniqueList 
+0

¡Las otras respuestas son mucho más geniales! – pyfunc

+2

Además, el módulo sets está en desuso, en su lugar, use el set-tipo incorporado. –