8
votes

Python Dictionnaire compte de valeurs uniques

J'ai un problème de comptage de valeurs distinctes pour chaque clé de Python.

J'ai un dictionnaire D comme xxx

J'ai besoin d'imprimer le nombre de valeurs distinctes par Chaque clé individuellement.

Cela signifie que je voudrais imprimer xxx

aide.

merci


4 commentaires

Vous voulez dire que vous avez une liste de dictionnaires? Ou est-il reproduit de manière incorrecte?


Ce n'est pas un dictionnaire, c'est au mieux une liste de dictionnaires (qui contiennent uniquement une paire de clé / valeur) - vraiment? Quel genre de structure de données est-ce? Et je suppose que c'est en fait [{"abc": "films"}, ... , non?


@Timpietzcker c'est vrai. Désolé pour l'erreur dans la représentation


Voir Stackoverflow.com/questions/10303788/...


6 Réponses :


2
votes
>>> d = [{"abc":"movies"}, {"abc": "sports"}, {"abc": "music"}, {"xyz": "music"},
... {"pqr":"music"}, {"pqr":"movies"},{"pqr":"sports"}, {"pqr":"news"}, 
... {"pqr":"sports"}]
>>> from collections import Counter
>>> counts = Counter(key for dic in d for key in dic.keys())
>>> counts
Counter({'pqr': 5, 'abc': 3, 'xyz': 1})
>>> for key in counts:
...     print (key, counts[key])
...
xyz 1
abc 3
pqr 5

0 commentaires

13
votes

Plus de 6 ans après avoir répondu, quelqu'un m'a signalé que j'ai mal interprété la question. Tandis que ma réponse originale (ci-dessous) compte unique Keys em> dans la séquence d'entrée, vous avez réellement un PROBLÈME DONNÉ DIFFICILE ; Vous voulez compter les valeurs par clé em>.

Pour compter les valeurs uniques par clé, exactement em>, vous devez collecter ces valeurs en ensembles d'abord: P> xxx pré>

qui pour votre entrée, produit: p> xxx pré>

Nous pouvons toujours envelopper cet objet dans un compteur () code > instance si vous souhaitez utiliser la fonctionnalité supplémentaire de cette classe offre, voir ci-dessous: p>

for key, count in counts.most_common():
    print '{}: {}'.format(key, count)

# prints
# 5: pqr
# 3: abc
# 1: xyz


3 commentaires

C'est très cool mais cela ne résout pas le problème. On a demandé des valeurs uniques. PQR retourne 5 mais devrait être renvoyé 4. CC: user1189851


@Seandunford: intéressant; On dirait en effet que j'ai mal interprété la question à l'époque, je ne sais pas pourquoi la OP a ensuite accepté ma réponse. Je vais le mettre à jour pour ajouter un nombre d'uniques-per-clés aussi.


@ Keandunford: Là-bas, a ajouté les comptes à droite à l'aide des ensembles et de quoi faire lorsque vous avez beaucoup plus de données que la mémoire.



3
votes

Qu'est-ce que vous décrivez - une liste avec plusieurs valeurs pour chaque touche - serait mieux visualisée par quelque chose comme ceci: xxx

dans ce cas, vous devez faire un peu Plus de travail à insérer:

  1. clé de recherche pour voir s'il existe déjà
    • Si n'existe pas, créez une nouvelle clé avec la valeur [] (Liste vide)
    • Récupérer la valeur (la liste associée à la clé)
    • Utilisez si la valeur dans Pour voir si la valeur en cours de vérification existe dans la liste
    • Si la nouvelle valeur n'est pas dans, .append () il

      Cela conduit également à un moyen simple de compter le nombre total d'éléments stockés: xxx


0 commentaires

1
votes

Utilisez une collection.Counter. En supposant que vous ayez une liste de dictionnaires d'un article ...

from collections import Counter
listOfDictionaries = [{'abc':'movies'}, {'abc':'sports'}, {'abc':'music'},
    {'xyz':'music'}, {'pqr':'music'}, {'pqr':'movies'},
    {'pqr':'sports'}, {'pqr':'news'}, {'pqr':'sports'}]
Counter(list(dict)[0] for dict in zzz)


0 commentaires

5
votes

Pas besoin d'utiliser un compteur. Vous pouvez y parvenir de cette manière:

# input dictionary
d=[{"abc":"movies"}, {"abc": "sports"}, {"abc": "music"}, {"xyz": "music"}, {"pqr":"music"}, {"pqr":"movies"},{"pqr":"sports"}, {"pqr":"news"}, {"pqr":"sports"}]

# fetch keys
b=[j[0] for i in d for j in i.items()]

# print output
for k in list(set(b)):
    print "{0}: {1}".format(k, b.count(k))


2 commentaires

Cela est encore plus rapide que d'utiliser avec compteur.


Oui, le compteur a des problèmes de performance Stackoverflow.com/Questtions/27801945/...



1
votes

bâtiment de la solution @akashdeep qui utilise l'ensemble mais donne un résultat erroné, car il ne compte pas pour l'exigence "distincte" mentionnée dans la question ( pqr code> devrait être 4, pas 5).

xyz: 1
abc: 3
pqr: 4


0 commentaires