python string list counter

python - Cómo agregar conteo para cada valor único en la lista



plt.title python (4)

De hecho, es posible (como ha pedido OP en algunos de los comentarios) hacer esto con solo una lista de comprensión, sin demasiados efectos secundarios indeseables. Sin embargo, no estoy seguro de que esto sea necesariamente una buena idea, ya que algunas personas pueden no encontrar el código más fácil de entender:

from collections import defaultdict import itertools temp = [''A'', ''B'', ''A'', ''B'', ''A'', ''B''] result = [j + "_" + str(next(c[j])) for c in [defaultdict(itertools.count)] for j in temp]

Supongamos que tengo una lista.

temp = [''A'', ''B'', ''A'', ''B'', ''A'', ''B'']

Estoy buscando una manera de unir el recuento de la cadena en el interior.

Salida prevista:

[''A_1'', ''B_1'', ''A_2'', ''B_2'', ''A_3'', ''B_3'']

Pude resolverlo utilizando una lista de comprensión, pero estoy buscando una forma en la que no tenga que especificar la lista [1, 1, 2, 2, 3, 3] . ¿Es posible?

[j + "_" + str(i) for i, j in zip([1, 1, 2, 2, 3, 3], temp)]


Puede usar collections.defaultdict con un bucle for :

from collections import defaultdict L = [''A'', ''B'', ''A'', ''B'', ''A'', ''B''] dd = defaultdict(int) res = [] for item in L: dd[item] += 1 res.append(f''{item}_{dd[item]}'') print(res) [''A_1'', ''B_1'', ''A_2'', ''B_2'', ''A_3'', ''B_3'']


Puede usar un diccionario (o, mejor aún, un collections.defaultdict ) para mantener los conteos de cada artículo:

from collections import defaultdict lst = [''A'', ''B'', ''A'', ''B'', ''A'', ''B''] lst2 = [] d = defaultdict(int) for item in lst: d[item] += 1 lst2.append(''{}_{}''.format(item, d[item])) print(lst2) # [''A_1'', ''B_1'', ''A_2'', ''B_2'', ''A_3'', ''B_3'']

Para utilizar una lista de comprensión aquí, necesitaría alguna forma de actualizar el estado (es decir, los contadores) para cada elemento a medida que itera la lista original. Para eso puedes usar una función con un argumento predeterminado, por ejemplo:

def get_count(item, d=defaultdict(int)): d[item] += 1 return ''{}_{}''.format(item, d[item]) lst2 = [get_count(item) for item in lst] print(lst2) # [''A_1'', ''B_1'', ''A_2'', ''B_2'', ''A_3'', ''B_3'']


Puedes usar un Counter o un defaultdict(int) para realizar un seguimiento de las veces que un personaje ha sido visto al encontrarlo.

>>> from collections import Counter >>> >>> temp = [''A'', ''B'', ''A'', ''B'', ''A'', ''B''] >>> seen = Counter() >>> >>> result = [] >>> for c in temp: ...: seen.update(c) ...: result.append(''{}_{}''.format(c, seen[c])) ...: >>> result >>> [''A_1'', ''B_1'', ''A_2'', ''B_2'', ''A_3'', ''B_3'']

Tenga en cuenta que seen.update(c) puede tener resultados inesperados si espera cadenas con más de un carácter en temp . Manifestación:

>>> seen = Counter() >>> seen.update(''ABC'') >>> seen >>> Counter({''A'': 1, ''B'': 1, ''C'': 1})

Dependiendo de cómo quiera contar y qué tipo de datos espera, puede usar la línea

seen[c] += 1

en lugar de

seen.update(c)

Alternativamente, sin ninguna importación:

>>> seen = {} >>> result = [] >>> >>> for c in temp: ...: seen[c] = seen.get(c, 0) + 1 ...: result.append(''{}_{}''.format(c, seen[c])) ...: >>> result >>> [''A_1'', ''B_1'', ''A_2'', ''B_2'', ''A_3'', ''B_3'']