python - tiene - Contando la cantidad de ocurrencias en una lista de tuplas
contar palabras en un archivo python (3)
Soy bastante nuevo en Python, pero no he podido encontrar una solución a mi problema en ningún lugar.
Quiero contar las ocurrencias de una cadena dentro de una lista de tuplas.
Aquí está la lista de tuplas:
list1 = [
(''12392'', ''some string'', ''some other string''),
(''12392'', ''some new string'', ''some other string''),
(''7862'', None, ''some other string'')
]
He intentado esto pero solo imprime 0
for entry in list1:
print list1.count(entry[0])
Como el mismo ID aparece dos veces en la lista, esto debería devolver:
2
1
También intenté incrementar un contador para cada aparición de la misma ID, pero no pude entender cómo escribirlo.
* EDITAR: Usando la asombrosa respuesta de Eumiro. Me di cuenta de que no expliqué todo el problema. De hecho, necesito la cantidad total de entradas que tiene un valor mayor que 1. Pero si intento hacerlo:
for name, value in list1:
if value > 1:
print value
Me sale este error:
ValueError: Too many values to unpack
Necesitaba alguna funcionalidad extra que Counter no tuviera. Tengo una lista de tuplas en las que el primer elemento es la clave y el segundo es la cantidad que se debe agregar. ¡La solución de @jamylak fue una gran adaptación para esto!
>>> list = [(0,5), (3,2), (2,1), (0,2), (3,4)]
>>> d = {}
>>> for x, y in list1:
d[x] = d.get(x, 0) + y
>>> d
{0: 7, 2: 1, 3: 6}
Tal vez las collections.Counter
Contador podría resolver su problema:
from collections import Counter
Counter(elem[0] for elem in list1)
devoluciones
Counter({''12392'': 2, ''7862'': 1})
Es rápido, ya que itera sobre su lista solo una vez. Recorrerá las entradas y luego tratará de obtener un recuento de estas entradas en su lista. Eso no se puede hacer con .count
, pero se puede hacer de la siguiente manera:
for entry in list1:
print sum(1 for elem in list1 if elem[0] == entry[0])
Pero en serio, echa un vistazo a las collections.Counter
.
EDITAR : En realidad necesito la cantidad total de entradas que tiene un valor mayor que 1.
Aún puedes usar el Counter
:
c = Counter(elem[0] for elem in list1)
sum(v for k, v in c.iteritems() if v > 1)
devuelve 2
, es decir, la suma de cuentas que son mayores que 1.
list1.count(entry[0])
no funcionará porque mira cada una de las tres tuplas en list1
, por ejemplo. (''12392'', ''some string'', ''some other string'')
y verifica si son iguales a ''12392''
por ejemplo, lo que obviamente no es el caso.
La respuesta de @ eurmiro le muestra cómo hacerlo con Counter
(¡cuál es la mejor manera!) pero aquí está la versión de un hombre pobre para ilustrar cómo funciona Counter
usando un diccionario y el dict.get(k, [,d])
, que intenta obtener una clave ( k
), pero si no existe, devuelve el valor predeterminado ( d
):
>>> list1 = [
(''12392'', ''some string'', ''some other string''),
(''12392'', ''some new string'', ''some other string''),
(''7862'', None, ''some other string'')
]
>>> d = {}
>>> for x, y, z in list1:
d[x] = d.get(x, 0) + 1
>>> d
{''12392'': 2, ''7862'': 1}