Python Générateur d'Expression pour l'Accumulation de Dictionnaire des Valeurs

Un générateur d'expression est en train de jeter à côté d'un grand nombre de tuple paires par exemple. sous forme de liste:

pairs = [(3, 47), (6, 47), (9, 47), (6, 27), (11, 27), (23, 27), (41, 27), (4, 67), (9, 67), (11, 67), (33, 67)]

Pour chaque paire en paire avec key = paire[0] et la valeur = paire[1], je veux nourrir ce flux de paires dans un dictionnaire de cumulativement ajouter les valeurs pour les touches correspondantes. La solution la plus évidente est:

dict_k_v = {}
for pair in pairs:
    try:
        dict_k_v[pair[0]] += pair[1]
    except:
        dict_k_v[pair[0]] = pair[1]

>>> dict_k_v
{33: 67, 3: 47, 4: 67, 6: 74, 9: 114, 11: 94, 41: 27, 23: 27}

Toutefois, cela pourrait être réalisé avec un générateur d'expression ou d'une même construction que ne pas utiliser une boucle for?

MODIFIER

Pour clarifier, le générateur d'expression est en train de jeter à côté d'un grand nombre de tuple paires:

(3, 47), (6, 47), (9, 47), (6, 27), (11, 27), (23, 27), (41, 27), (4, 67), (9, 67), (11, 67), (33, 67) ...

et je veux accumuler chaque paire clé-valeur dans un dictionnaire (voir Paul McGuire réponse) que chaque paire est généré. Les paires = liste[] déclaration est inutile et désolé à ce sujet. Pour chaque paire (x,y), x est un entier et y peuvent être un nombre entier ou décimal/float.

Mon générateur d'expression est de la forme:

((x,y) for y in something() for x in somethingelse())

et pour accumuler chaque (x,y) de la paire dans un defaultdict. Hth.

  • Qu'est-ce que cette aversion pour les boucles dernièrement? Une boucle enroulée autour d'une accumulation dans un defaultdict est la solution la plus propre.
  • J'ai juste eu une longue discussion à propos de toutes les options pour pousser dans un dict et il s'avère que le moyen le plus efficace pour le code c'est avec des si la clé dans le dict: / autre: (non pas que vous vouliez utiliser une boucle for 🙂
  • Le premier aversion pour les boucles le risque de dégradation des performances lorsque les ensembles de données sont très importantes et/ou de l'exécution de l'opération continuellement. Une option est Cython, mais je voudrais voir si il y a un Python solution qui utilise les fonctions intégrées.
  • Dans sa réponse, Paul McGuire ajoute explicitement à la question de ce que j'avais supposé évident (oups!) c'est à dire. "... accepter chaque paire clé-valeur qui lui sont envoyées, et de les accumuler dans un defaultdict passés dans celui-ci". J'ai ajouté ceci à la question d'origine.