Nuestro team de trabajo ha estado por horas buscando la respuesta a tu pregunta, te ofrecemos la solución de modo que nuestro deseo es servirte de gran apoyo.
Solución:
En lugar de listcomp como en otra solución, puede usar la función itemgetter()
:
from collections import Counter
from operator import itemgetter
MyList = ["a", "b", "c", "c", "a", "c"]
c = Counter(MyList)
itemgetter(*MyList)(c)
# (2, 1, 3, 3, 2, 3)
ACTUALIZACIÓN: Como @ALollz mencionó en los comentarios, esta solución parece ser la más rápida. Si OP necesita una lista en lugar de una tupla, el resultado debe convertirse con list()
.
Puedes usar el list.count
método, que contará la cantidad de veces que cada string tiene lugar en MyList
. Puede generar una nueva lista con los recuentos utilizando una lista de comprensión:
MyList = ["a", "b", "c", "c", "a", "c"]
[MyList.count(i) for i in MyList]
# [2, 1, 3, 3, 2, 3]
Usar np.unique
para crear un diccionario de recuentos de valores y mapear los valores. Esto será rápido, aunque no tan rápido como los métodos Counter:
import numpy as np
list(map(dict(zip(*np.unique(MyList, return_counts=True))).get, MyList))
#[2, 1, 3, 3, 2, 3]
Algunos tiempos para una lista de tamaño moderado:
MyList = np.random.randint(1, 2000, 5000).tolist()
%timeit [MyList.count(i) for i in MyList]
#413 ms ± 165 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit list(map(dict(zip(*np.unique(MyList, return_counts=True))).get, MyList))
#1.89 ms ± 1.73 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit pd.DataFrame(MyList).groupby(MyList).transform(len)[0].tolist()
#2.18 s ± 12.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
c=Counter(MyList)
%timeit lout=[c[i] for i in MyList]
#679 µs ± 2.33 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
c = Counter(MyList)
%timeit list(itemgetter(*MyList)(c))
#503 µs ± 162 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Lista más grande:
MyList = np.random.randint(1, 2000, 50000).tolist()
%timeit [MyList.count(i) for i in MyList]
#41.2 s ± 5.27 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit list(map(dict(zip(*np.unique(MyList, return_counts=True))).get, MyList))
#18 ms ± 56.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit pd.DataFrame(MyList).groupby(MyList).transform(len)[0].tolist()
#2.44 s ± 12.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
c=Counter(MyList)
%timeit lout=[c[i] for i in MyList]
#6.89 ms ± 22.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
c = Counter(MyList)
%timeit list(itemgetter(*MyList)(c))
#5.27 ms ± 10.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Si te apasiona la programación, tienes la opción de dejar una sección acerca de qué te ha impresionado de este ensayo.