2013-06-20 6 views
15

Je suis aux prises avec un problème mineur en Python (mon programme est actuellement en version 3.2.3).Imprimer toutes les valeurs uniques dans un dictionnaire Python

J'ai un dictionnaire qui ressemble à ceci (ce qui est juste un exemple, en fait pris d'un autre poste ici):

[{"abc":"movies"}, {"abc": "sports"}, {"abc": "music"}, {"xyz": "music"}, {"pqr":"music"}, {"pqr":"movies"},{"pqr":"sports"}, {"pqr":"news"}, {"pqr":"sports"}] 

Je veux imprimer simplement() une liste de valeurs uniques, ce qui élimine les doublons. A la fin de cette liste, je voudrais imprimer le nombre de valeurs uniques dans le dictionnaire:

movies 
sports 
music 
news 

4 

Toute aide est appréciée. Il y a quelques autres posts que j'ai trouvés qui étaient quelque peu liés, mais je ne connais pas assez Python pour l'appliquer à ce problème spécifique.

+6

vous avez une * liste * de dictionnaires. – jfs

Répondre

9

Utilisez un set():

from itertools import chain 

unique_values = set(chain.from_iterable(d.values() for d in dictionaries_list)) 
for value in unique_values: 
    print(value) 

print(len(unique_values)) 

Utilisez .itervalues() sur Python 2 pour un peu plus d'efficacité. Parce que vous avez un liste des dictionnaires, nous devons d'abord tirer les valeurs de chacun de ces dictionnaires; Je itertools.chain.from_iterable() avec une expression de générateur à la liste toutes les valeurs dans une séquence:

>>> for value in set(chain.from_iterable(d.values() for d in dictionaries_list)): 
...  print(value) 
... 
news 
sports 
movies 
music 

L'alternative est d'utiliser des boucles imbriquées dans l'expression du générateur:

>>> for value in set(v for d in dictionaries_list for v in d.values()): 
...  print(value) 
... 
news 
sports 
movies 
music 
25

Utilisez set ici car ils ne contiennent que des objets uniques .

>>> lis = [{"abc":"movies"}, {"abc": "sports"}, {"abc": "music"}, {"xyz": "music"}, {"pqr":"music"}, {"pqr":"movies"},{"pqr":"sports"}, {"pqr":"news"}, {"pqr":"sports"}] 
>>> s = set(val for dic in lis for val in dic.values()) 
>>> s 
set(['movies', 'news', 'music', 'sports']) 

Boucle sur cet ensemble pour obtenir le résultat attendu:

for x in s:         
    print x 
print len(s) #print the length of set after the for-loop 
... 
movies 
news 
music 
sports 
4 

Cette ligne s = set(val for dic in lis for val in dic.values()) est à peu près équivalent à:

s = set() 
for dic in lis: 
    for val in dic.values(): 
     s.add(val) 
+1

Points permettant d'expliquer la compréhension de la liste imbriquée. – DuffJ

+0

Cette liste imbriquée est folle, je n'y aurais jamais pensé. – ToothlessRebel

4
dict = {'511':'Vishnu','512':'Vishnu','513':'Ram','514':'Ram','515':'sita'} list =[] 
for val in dict.values(): 
    if val in list: 
    continue 
    else: 
    list.append(val) 

print list 
+0

Veuillez formater votre réponse en code. – tfv

6

Vous pouvez Explot les propriétés de set pour Cet objectif; Chaque élément est unique et les doublons seront ignorés.

uniqueValues = set(myDict.values()) 

En utilisant set de cette façon, de dupliquer des éléments retournés de .values() seront mis au rebut. Vous pouvez ensuite les imprimer comme suit:

for value in uniqueValues: 
    print(value) 
print(len(uniqueValues)) 
Questions connexes