2009-01-12 18 views
5

zwei Wörterbücher Gegeben, d1 und d2, und eine ganze Zahl l, möchte ich k alle Schlüssel finden in d1, so dass entweder d2[k]<l oder k not in l. Ich möchte die Schlüssel und die entsprechenden Werte in d2 ausgeben, außer wenn d2 den Schlüssel nicht enthalten, ich will 0. Zum Beispiel drucken, wenn d1 istVergleich Wörterbücher in Python

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

und d2 ist

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

l und 90 ist, würde der Ausgang (möglicherweise in einer anderen Reihenfolge) seine

b 89 
c 0 

W Hut ist der beste Weg, dies in Python zu tun? Ich beginne gerade die Sprache zu lernen, und so weit das ist, was ich habe:

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

Dies funktioniert natürlich (es sei denn ich einen Tippfehler), aber es scheint mir, dass es wäre ein pythonic Weg es zu tun.

+0

Im ersten Absatz meinst du "k nicht in d2" statt "k nicht in l"? –

Antwort

4

Sie können dies vereinfachen, indem Sie ein Standarddict verwenden. Der Aufruf von __getitem__ auf einem Standarddict gibt den "Standard" -Wert zurück.

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

Ein anderes Bit, das Sie ändern könnten, ist nicht Schlüssel zu rufen. Das Wörterbuch implementiert iter. Es wäre besser, einfach zu schreiben:

for k in d1: 
10

Ihr eigentlich in Ordnung ist - Sie können es zu

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

vereinfachen könnte, die (für mich) pythonic ist, und ist so ziemlich eine direkte „Übersetzung“ in Code deiner Beschreibung.

Wenn Sie die Doppel Lookup vermeiden möchten, können Sie

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

hier tun können, ist eine kompakte Version, aber Ihnen ist völlig in Ordnung:

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 ] 

Ausgang:

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

Das ist wirklich ein +1 für Daniel –

Verwandte Themen