Discussion:
Contar elementos únicos en una lista
Javier Castrillo
2009-11-14 13:25:29 UTC
Permalink
Estuve buscando un método de contar elementos únicos en una lista y no
lo encontré. Al parecer hay algo parecido en Python 3.1 según lo que
pude ver aquí:

http://elornitorrincoenmascarado.blogspot.com/2009/07/novedades-de-python-31.html

donde dice:

"
Añadida una nueva clase, collections.Counter, para facilitar el
Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
Counter({'blue': 3, 'red': 2, 'green': 1})

(Contribución de Raymond Hettinger; issue 1696199).
"

Aunque no me soluciona del todo, es un aporte.

Yo lo he resuelto así, aunque me resulta medio feo.
lista_original = ['juan', 'pedro', 'carlos', 'juan']
lista = lista_original[:]
lista.remove(elemento)
print len(lista)
3

La pregunta es: hay alguna manera más pythónica de resolverlo?
(calculo que debe haber varias).
El requisito es que no me altere la lista original, como habrán advertido.

Saludos y gracias
--
Javier Castrillo

=========================================================
GNU / Linux User #242275

Jabber: Riverplatense-***@public.gmane.org
Blog: http://blog.javiercastrillo.com.ar
Site: http://carapa.com.ar
TCOS: http://argentina.tcosproject.org
=========================================================
Usá Software Libre
Marcelo Rinesi
2009-11-14 13:41:01 UTC
Permalink
Post by Javier Castrillo
La pregunta es: hay alguna manera más pythónica de resolverlo?
(calculo que debe haber varias).
El requisito es que no me altere la lista original, como habrán advertido.
print len(set(lista)) ?
Facundo Batista
2009-11-14 16:02:18 UTC
Permalink
Post by Marcelo Rinesi
Post by Javier Castrillo
La pregunta es: hay alguna manera más pythónica de resolverlo?
...
print len(set(lista)) ?
Sí, esta es *la* manera.

Slds.
--
. Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
Gonzalo Sainz Trápaga
2009-11-14 18:42:24 UTC
Permalink
Post by Facundo Batista
Post by Marcelo Rinesi
print len(set(lista)) ?
Sí, esta es *la* manera.
Cabe aclarar que las demás maneras, además de ser más complicadas, son
cuadráticas, mientras que usar set() debería ser más lineal.

Si tienen que hacer esta operación con un volumen de datos para el que
usar un set() no escala decentemente, otra forma sencilla de hacerlo
con complejidad n log n es ordenar primero la secuencia.

Saludos ;)
p8queen
2009-11-15 11:52:32 UTC
Permalink
Post by Facundo Batista
Post by Marcelo Rinesi
print len(set(lista)) ?
Sí, esta es *la* manera.
print len(set(lista)) +1. En charla que di en PyCon vimos conjuntos y
con un profe de matemática de la facu estuvimos probando la velocidad
de contar elementos no repetidos en una lista y encontramos que la
funcion set era la mejor opcion.

Cuando haces set(lista) te convierte la lista y list(set(lista)) tenes
la lista de elementos no repetidos, pero desornados. Porque en
matematica, por definición, conjunto se refiere a elementos
desornados.
--
Gustavo Carmona
Javier Castrillo
2009-11-15 12:36:56 UTC
Permalink
Muchas gracias a todos!

saludos
--
Javier Castrillo

=========================================================
GNU / Linux User #242275

Jabber: ***@jabberes.org
Blog: http://blog.javiercastrillo.com.ar
Site: http://carapa.com.ar
TCOS: http://argentina.tcosproject.org
=========================================================
Usá Softwar
Gabriel Genellina
2009-11-16 01:53:23 UTC
Permalink
En Sun, 15 Nov 2009 08:52:32 -0300, p8queen
2009/11/14 Gonzalo Sainz Trápaga
2009/11/14 Facundo Batista
2009/11/14 Marcelo Rinesi
Post by Marcelo Rinesi
print len(set(lista)) ?
Sí, esta es *la* manera.
print len(set(lista)) +1. En charla que di en PyCon vimos conjuntos y
con un profe de matemática de la facu estuvimos probando la velocidad
de contar elementos no repetidos en una lista y encontramos que la
funcion set era la mejor opcion.
Sí, sólo que a veces no alcanza; podés necesitar los elementos únicos en
el mismo orden original, y a veces los elementos no cumplen las
condiciones para pertenecer a un set. Esta receta toma todo eso en cuenta:
http://code.activestate.com/recipes/438599/
Si sólo importa la cantidad, sería len(unique(lista, False))
--
Gabriel Genellina
Claudio Freire
2009-11-17 18:26:34 UTC
Permalink
Sí, sólo que a veces no alcanza; podés necesitar los elementos únicos en el
mismo orden original, y a veces los elementos no cumplen las condiciones
http://code.activestate.com/recipes/438599/
Si sólo importa la cantidad, sería len(unique(lista, False))
Python3 tiene un diccionario con orden que puede ser muy útil para eso.

http://docs.python.org/3.1/whatsnew/3.1.html

Python2.6 no lo tiene por cierto :-(

Mariano Campo
2009-11-14 15:20:01 UTC
Permalink
Post by Javier Castrillo
Yo lo he resuelto así, aunque me resulta medio feo.
lista_original = ['juan', 'pedro', 'carlos', 'juan']
lista = lista_original[:]
        lista.remove(elemento)
print len(lista)
3
La pregunta es: hay alguna manera más pythónica de resolverlo?
(calculo que debe haber varias).
El requisito es que no me altere la lista original, como habrán advertido.
Siguiendo con el hilo de las list comprehensions, podes hacer:

unicos = [x for x in lista_original if lista_original.count(x) == 1]

Después haces len(unicos) y ya.

Saludos!
Continúe leyendo en narkive:
Loading...