Digamos que hay 3 diccionarios first, second, third con los siguientes valores

first = {'a': 0.2, 'b': 0.001}
second = {'a': 0.99, 'c': 0.78}
third = {'c': 1, 'd': 0.1}
total = {'_first': first, '_second': second, '_third':third}

¿Hay alguna manera de rápidamente obtener una estructura de datos que pueda contener la información del conteo de cada clave (a, b, c, {{X3 }}) usando total en lugar de múltiples diccionarios. Por ejemplo, la respuesta debería devolver algo como {'a':2, 'b':2, 'c':2, 'd':1} ya que la clave a, b, c se produjo dos veces, mientras que d se produjo solo una vez en estos diccionarios.

1
codecodercoding 3 oct. 2019 a las 19:10

3 respuestas

La mejor respuesta
from collections import Counter
from itertools import chain
first = {'a': 0.2, 'b': 0.001}
second = {'a': 0.99, 'c': 0.78}
third = {'c': 1, 'd': 0.1}
print(Counter(chain(first, second, third)))

Para tener en cuenta la pregunta editada con un número variable de dictos almacenados en un dict total

total = {'_first': first, '_second': second, '_third':third}
print(Counter(chain.from_iterable(total.values())))
2
buran 3 oct. 2019 a las 16:35

Sin ninguna importación:

def dict_keys_count(*dicts):
    keys = []
    for _dict in dicts:
        keys += _dict.keys()

    keys_counts = {}
    for key in set(keys):
        keys_counts[key] = keys.count(key)

    return keys_counts
print(dict_keys_count(first,second,third))
# {'b': 1, 'c': 2, 'd': 1, 'a': 2}

Comparación de velocidad : mi respuesta aceptada vs mi

from time import time

t0 = time()
for _ in range(int(1e7)):
    dict_keys_count(first,second,third)
print("No-import solution {}:".format(time() - t0))
# 17.77

t0 = time()
for _ in range(int(1e7)):
    Counter(chain(first, second, third))
print("Accepted solution {}:".format(time() - t0))
# 24.01
1
OverLordGoldDragon 3 oct. 2019 a las 16:54

Puedes usar collections.Counter:

import collections
first = {'a': 0.2, 'b': 0.001}
second = {'a': 0.99, 'c': 0.78}
third = {'c': 1, 'd': 0.1}
r = dict(collections.Counter([*first, *second, *third]))

Salida:

{'a': 2, 'c': 2, 'b': 1, 'd': 1}
0
Ajax1234 3 oct. 2019 a las 16:13
58223060