2009-01-12 4 views
5

Étant donné deux dictionnaires, d1 et d2, et un entier l, je veux trouver toutes les clés k dans d1 de sorte que soit d2[k]<l ou k not in l. Je veux sortir les clés et les valeurs correspondantes dans d2, sauf si d2 ne contient pas la clé, je veux imprimer 0. Par exemple, si d1 estdictionnaires en Python Comparaison

a: 1 
b: 1 
c: 1 
d: 1 

et d2 est

a: 90 
b: 89 
x: 45 
d: 90 

et l est 90, la sortie serait (éventuellement dans un ordre différent)

b 89 
c 0 

W chapeau est le meilleur moyen de le faire en Python? Je commence tout juste d'apprendre la langue, et jusqu'à présent c'est ce que j'ai:

for k in d1.keys(): 
    if k not in d2: 
     print k, 0 
    else: 
     if d2[k]<l: 
      print k, d2[k] 

Cela fonctionne bien sûr (à moins d'avoir une faute de frappe), mais il me semble qu'il y aurait une façon plus pythonique de le faire.

+0

Dans le premier paragraphe, voulez-vous dire "k pas dans d2" au lieu de "k pas dans l"? –

Répondre

4

Vous pouvez simplifier cela en utilisant un defaultdict. Appeler __getitem__ sur un defaultdict retournera la valeur "default".

from collections import defaultdict 
d = defaultdict(int) 
print d['this key does not exist'] # will print 0 

Un autre bit que vous pouvez modifier est de ne pas appeler des clés. Le dictionnaire implémente iter. Il serait préférable de simplement écrire:

for k in d1: 
10

vôtre est en fait bien - vous pouvez simplifier à

for k in d1: 
    if d2.get(k, 0) < l: 
     print k, d2.get(k, 0) 

qui est (pour moi) pythonique, et est à peu près directement « traduction » dans le code de votre description.

Si vous voulez éviter la double recherche, vous pouvez faire

for k in d1: 
    val = d2.get(k, 0) 
    if val < l: 
     print k, val 
2

Voici une version compacte, mais le vôtre est parfaitement OK:

from collections import defaultdict 

d1 = {'a': 1, 'b': 1, 'c': 1, 'd': 1} 
d2 = {'a': 90, 'b': 89, 'x': 45, 'd': 90} 
l = 90 

# The default (==0) is a substitute for the condition "not in d2" 
# As daniel suggested, it would be better if d2 itself was a defaultdict 
d3 = defaultdict(int, d2) 
print [ (k, d3[k]) for k in d1 if d3[k] < l ] 

Sortie:

[('c', 0), ('b', 89)] 
+0

Ceci est vraiment un +1 pour daniel –

Questions connexes