2017-06-27 2 views

Antwort

5

funktioniert Da diese dicts gleiche Länge haben, finden wir den kleinsten Schlüssel für die die entsprechenden Werte ungleich sind, das heißt 'john'. Dann werden die Dicts auf den Wert dieses Schlüssels verglichen.

Demo:

>>> d1 = {"john":40, "peter":45} 
>>> d2 = {"john":466, "peter":45} 
>>> d1 < d2 
True 
>>> d2['john'] = 39 
>>> d1 < d2 
False 

Diese Grundidee her im Wesentlichen unverändert seit Guido's commit von mehr als 20 Jahren ist:

$ git show a0a69b8 
commit a0a69b8b429f3d4c91f1c432247cfda017505976 
Author: Guido van Rossum <[email protected]> 
Date: Thu Dec 5 21:55:55 1996 +0000 

    Experimental new implementation of dictionary comparison. This 
    defines that a shorter dictionary is always smaller than a longer one. 
    For dictionaries of the same size, the smallest differing element 
    determines the outcome (which yields the same results as before, 
    without explicit sorting). 

Es ist nicht dokumentiert, und der 3 dict Vergleichscode entfernt in Python, also würde ich mich auf nichts Wichtiges verlassen. Die relevante CPython-Quelle ist here.

Fun Tatsache: Offenbar, in älteren Versionen von Python, einige dict-Vergleiche konnte die Laufzeit abstürzen und könnte sogar cause Windows 98 to reboot. Heh.

-1
>>> d2>d1 
True 
>>> d3 = {"john":40, "peter":45} 
>>> d1>=d3 
True 

Wie Sie oben sehen können, Vergleich auf Wörterbüchern erfolgt per Schlüssel. Diese sind gleich;

>>> res = [] 
>>> for key1,val1 in d1.iteritems(): 
...  res.append(val1 >d2[key1]) 
>>> res 
[False, False] 
>>> all(res) 
False 
>>> d1 > d2 
False 
1

Wörterbücher, wie Sätze, halten nicht eine wohldefinierte, um auf ihre Elemente. Außerdem ist das Konzept einer Teilmenge der Regel nicht sinnvoll für Wörterbücher, so der dict Klasse nicht Operatoren wie < unterstützen. Wörterbücher unterstützen den Begriff der Äquivalenz mit d1 == d2 , wenn die beiden Wörterbücher den gleichen Satz von Schlüssel- Wertpaaren enthalten.

Also, was Sie tun können, ist,

d1 == d2 #d1 is equivalent to d2 
d1 != d2 #d1 is not equivalent to d2 

jedoch nicht > < >= <=

tun Dies ist in Python 3.

>>> a 
{1: '1', 2: '2'} 
>>> b 
{1: '1', 2: '2'} 
>>> a==b 
True 
>>> a<b 
Traceback (most recent call last): 
    File "<pyshell#31>", line 1, in <module> 
    a<b 
TypeError: unorderable types: dict() < dict() 
>>> a>b 
Traceback (most recent call last): 
    File "<pyshell#32>", line 1, in <module> 
    a>b 
TypeError: unorderable types: dict() > dict() 
>>> 

jedoch in Python 2 zu sehen, dies,

>>> a = {2:2} 
>>> b = {2:2} 
>>> a==b 
True 
>>> a<b 
False 
>>> a>b 
False 

Aber wenn die key ist gleich und value unterscheidet

>>> a={3:1} 
>>> b={3:2} 
>>> a<b 
True 
>>> a>b 
False 

Auch wenn value gleich ist,

>>> a={3:0} 
>>> b={3:0} 
>>> a==b 
True 
>>> a<b 
False 
>>> a>b 
False 

Aber dies bemerken, wenn der Wert in der ersten dict größer ist

>>> a={3:200} 
>>> b={3:10} 
>>> a<b 
False 
>>> a>b 
True 

Bis jetzt hatten wir dasselbe key verschiedene values jetzt wollen sie das ändern,

Jetzt Gleichen Wert unterschiedlichen Schlüssel

>>> a={2:10} 
>>> b={3:10} 
>>> a<b 
True 
>>> a>b 
False 
>>> 
>>> a={10:10} 
>>> b={1:10} 
>>> a<b 
False 
>>> a>b 
True 

Was können Sie von diesem erhalten, Python 2 entweder Schlüssel wird überprüft und wenn es gleich, nur dann, Wert wird geprüft. Jetzt haben wir andere Schlüssel, andere Werte,

>>> a={10:10} 
>>> b={1:100} 
>>> a<b 
False 
>>> a>b 
True 

Aha! In diesem Fall können Sie schlussfolgern, dass key das erste ist, was überprüft wird, und wenn sie gleich sind, wird der Wert geprüft. Jetzt haben wir mehr als ein key:value Paar in unserem Wörterbuch?

>>> a={10:10,1:10} 
>>> b={10:10,2:10} 
>>> a<b 
True 
>>> a>b 
False 
>>> a={10:10,200:10} 
>>> b={10:10,1:10} 
>>> a<b 
False 
>>> a>b 
True 

So heißt es. Jeder key wird überprüft und dann wird key der gleiche Wert überprüft. Ah, aber wie funktioniert die Schlüsselüberprüfung? Dafür bei dict_compare source code

HINWEIS einen Blick: Die Methode cmp() gibt das Vorzeichen der Differenz von zwei Zahlen: -1, wenn x < y, 0, wenn x == y, oder 1, wenn x> y

Also, was passiert, ist, dass zu vergleichen, dicts A und B, Längen werden zuerst verglichen (gleich kein Problem). Wenn sie ungleich sind, dann gebe cmp zurück (len (A), len (B)).

Als nächstes finden Sie die Schlüssel akey in A, die der kleinste Schlüssel ist, für die

akey not in B or A[akey] != B[akey] -> (Dies geschieht nur, wenn akey in B).

(Wenn es keinen solchen Schlüssel ist, sind die dicts gleich.)

auch (muss), um den kleinsten Schlüssel bkey in B finden, für die

bkey not in A oder A[bkey] != B[bkey] -> (Diese passiert nur, wenn bkey in B vorhanden ist.

Wenn akey! = Bkey, geben Sie cmp (akey, bkey) zurück. Else Rückkehr cmp (A [akey], B [bkey])

>>> a={10:10,200:10} 
>>> b={10:10,1:10} 
>>> a<b 
False 
>>> a>b 
True 
>>> cmp(200,1) 
1 
>>> cmp(1,200) 
-1 

der kleinste Schlüssel in A So nicht in B ist 200 ähnlich 1 in A.

Jetzt vergleicht intern Python sie nach dem oben genannten Algorithmus so cmp(200,1) würde berechnet werden, wenn a>b getan wird. Sonst wenn a<b fertig ist.

Aber das war völlig aus Python entfernt 3. Dies ist nicht in Python 3.