2010-07-09 11 views
13

Zum Beispiel, sagen wir, ich auf Wörterbücher haben:Pythonischer Weg, um zu prüfen, ob zwei Wörterbücher den gleichen Schlüsselsatz haben?

d_1 = {'peter': 1, 'adam': 2, 'david': 3} 

und

d_2 = {'peter': 14, 'adam': 44, 'david': 33, 'alan': 21} 

Was ist der klügste Weg, ob die beiden Wörterbücher den gleichen Satz von Tasten enthalten überprüfen? Im obigen Beispiel sollte False zurückgegeben werden, da d_2 den Schlüssel 'alan' enthält, der nicht d_1 ist. Bitte beachten Sie, dass ich nicht daran interessiert bin zu überprüfen, dass die zugehörigen Werte für jeden Schlüssel gleich sind, nur dass die Schlüsselmenge gleich ist.

Antwort

18

Sie können die Schlüssel für ein Wörterbuch mit dict.keys() erhalten.

Sie können diese wiederum in einem Satz mit Satz (dict.keys())

Sie können Sets vergleichen ==

Fazit:

set(d_1.keys()) == set(d_2.keys()) 

wird dir geben, was Sie wollen.

+0

Sie brauchen 'Schlüssel' dort nicht. – SilentGhost

+1

Noch einfacher als das, da set (dict) gibt nur die Tasten ... –

+1

Wahr, Sie brauchen die Schlüssel nicht, aber wenn Sie nicht sehr oft Sätze verwenden würde ich sagen, dass das Verhalten von Satz (Wörterbuch) ist nicht offensichtlich. Weiß jemand, ob die Verwendung von Schlüsseln zu einem Performance-Hit führt? – xorsyst

0
>>> not set(d_1).symmetric_difference(d_2) 
False 
>>> not set(d_1).symmetric_difference(dict.fromkeys(d_1)) 
True 
-1

Eine schnelle Option (nicht sicher, ob es das optimalste)

len(set(d_1.keys()).difference(d_2.keys())) == 0 
+0

SilentGhost Antwort gibt false zurück, wenn die Schlüssel gleich sind aber die Werte sind unterschiedlich – Alex

+2

Überprüfung auf len == 0 ist wahrscheinlich das unpythonic Sache. – SilentGhost

+0

@Alex Nein. Versuch es selber. – augurar

24

In Python2,

set(d_1) == set(d_2) 

In Python3, können Sie dies tun, die mehr ein klein wenig sein kann effizienter als das Erstellen von Sets

d1.keys() == d2.keys() 

a bwohl die Python2 Weise funktionieren würde zu

+1

+1 für den Python 3 Weg – Joschua

0

Einer Möglichkeit für symmetric difference (neuen Satz mit Elementen in entweder s oder t, aber nicht beides) zu überprüfen ist:

set(d_1.keys()).symmetric_difference(set(d_2.keys())) 

Aber ein kürzerer Weg, um es nur die Sätze vergleichen :

set(d_1) == set(d_2) 
2
  • In Python 3 dict.keys() Gibt eine "view object", der wie ein Satz verwendet werden kann. Dies ist viel effizienter als das Erstellen einer separaten Menge.

    d_1.keys() == d_2.keys() 
    
  • In Python 2.7, dict.viewkeys() macht das Gleiche.

    d_1.viewkeys() == d_2.viewkeys() 
    
  • In Python 2.6 und unten, haben Sie eine Reihe von Tasten jeden dict zu konstruieren.

    set(d_1) == set(d_2) 
    

    Oder Sie können für eine höhere Speichereffizienz selbst über die Tasten iterieren.

    len(d_1) == len(d_2) and all(k in d_2 for k in d_1) 
    
Verwandte Themen