Debe haber una forma mejor / más eficiente de hacer esto. Quiero incrementar una variable si la primera cadena coincide, o la segunda variable si coincide con la segunda cadena.

ifCount = 0
elseCount = 0
for x in dict:
    if x["bla"] == 'this':
        ifCount += 1
    elif x["bla"] == 'that':
        elseCount += 1
-1
Esuom 8 jun. 2021 a las 21:29

3 respuestas

La mejor respuesta
from collections import Counter
from operator import itemgetter

items = [
    {"bla": "this"},
    {"bla": "this"},
    {"bla": "that"},
    {"bla": "that"},
    {"bla": "that"},
    {"bla": "that"},
    {"bla": "this"},
    {"bla": "that"}
]

counter = Counter(map(itemgetter("bla"), items))

print(counter["this"])
print(counter["that"])

Salida:

3
5
>>> 
0
Paul M. 8 jun. 2021 a las 18:35

En términos de eficiencia, no hay nada de malo en su código. Es conciso e iterta una vez. Si desea acortarlo un poco, podemos usar filter.

ifCount = len(filter(lambda x: x['bla'] == 'this', dict))
elseCount = len(filter(lambda x: x['bla'] == 'this', dict))

Es más corto, pero es discutible si es más legible o menos. Esta sintaxis puede tener sentido en una base de código más grande donde la lambda es realmente una función de uso frecuente y conocido, pero en este ejemplo aislado, argumentaría que el bucle for es más legible.

0
Silvio Mayolo 8 jun. 2021 a las 18:34

La forma "obvia" de manejar esto es con un dictado para contar las ocurrencias. Primero, cambie el nombre de su Iterable existente desde dict a algo que se puede usar, digamos d por ahora ...

Simplemente use un objeto de contador.

from collections import Counter
label_count = Counter(entry["bla"] for entry in d)

label_count ahora contiene los conteos de todas las entradas "bla" en d - específicamente, su cuenta de this y that. Si solo desea los dos elementos de muchos, puede agregar una cláusula if entry["bla"] in ["this", "that"].

0
Prune 8 jun. 2021 a las 18:35