ordered - Python: Collections.Counter vs defaultdict(int)
python 3 ordered set (2)
Supongamos que tengo algunos datos que se parecen a los siguientes.
Lucy = 1
Bob = 5
Jim = 40
Susan = 6
Lucy = 2
Bob = 30
Harold = 6
Quiero combinar 1) eliminar claves duplicadas, y 2) agregar los valores para estas claves duplicadas. Eso significa que obtendría la clave / valores:
Lucy = 3
Bob = 35
Jim = 40
Susan = 6
Harold = 6
¿Sería mejor usar (de las colecciones) un contador o un dictado predeterminado para esto?
Tanto Counter
como defaultdict(int)
pueden funcionar bien aquí, pero hay pocas diferencias entre ellos:
Counter
compatible con la mayoría de las operaciones que puede realizar en un multiset . Por lo tanto, si desea utilizar esas operaciones, vaya a Contador.Counter
no agregará nuevas claves al dictador cuando solicite claves faltantes. Por lo tanto, si sus consultas incluyen claves que pueden no estar presentes en el dictado, entonces utilice mejorCounter
.
Ejemplo:
>>> c = Counter()
>>> d = defaultdict(int)
>>> c[0], d[1]
(0, 0)
>>> c
Counter()
>>> d
defaultdict(<type ''int''>, {1: 0})
Ejemplo:
-
Counter
también tiene un método llamadomost_common
que le permite ordenar los artículos por su cuenta. Para obtener lo mismo endefaultdict
tendrás que usarsorted
.
Ejemplo:
>>> c = Counter(''aaaaaaaaabbbbbbbcc'')
>>> c.most_common()
[(''a'', 9), (''b'', 7), (''c'', 2)]
>>> c.most_common(2) #return 2 most common items and their counts
[(''a'', 9), (''b'', 7)]
-
Counter
también le permite crear una lista de elementos del objeto Contador.
Ejemplo:
>>> c = Counter({''a'':5, ''b'':3})
>>> list(c.elements())
[''a'', ''a'', ''a'', ''a'', ''a'', ''b'', ''b'', ''b'']
Entonces, dependiendo de lo que quieras hacer con el dictado resultante, puedes elegir entre Counter
y defaultdict(int)
.
defaultdict(int)
uso de defaultdict(int)
para sumar conteos, como en este caso, y Counter()
para contar elementos de lista. En su caso, la siguiente sería la solución más limpia:
name_count = [
("Lucy", 1),
("Bob", 5),
("Jim", 40),
("Susan", 6),
("Lucy", 2),
("Bob", 30),
("Harold", 6)
]
aggregate_counts = defaultdict(int)
for name, count in name_count:
aggregate_counts[name] += count