ordereddict ordered example python dictionary

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 mejor Counter .

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 llamado most_common que le permite ordenar los artículos por su cuenta. Para obtener lo mismo en defaultdict tendrás que usar sorted .

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