2017-06-27 9 views

答えて

5

動作しないのpython 3から完全に除去された、我々は、対応する値が等しくないいる最小キー、すなわち'john'を見つけます。次に、そのキーの値で辞書を比較します。

デモ:

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

この基本的な考え方は、20年以上前からGuido's commitので、本質的に不変である:

$ 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). 

、それが文書化されていない、とdictの比較コードはPython 3で除去しますだから私は何か重要なことにそれに頼ることはありません。関連するCPythonソースはhereです。

楽しい事実:明らかに、古いバージョンのPythonでは、一部のdict比較がランタイムをクラッシュさせ、さらにcause Windows 98 to rebootになる可能性があります。 Heh。

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

上記のように、キーによる辞書の比較。これらは等しいです。

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

辞書は、セットのように、その要素に明確に定義された順序を維持しません。 はさらに、部分集合の概念は、辞書のための、典型的には意味がないので、 辞書クラスは <ような演算子をサポートしていません。辞書は、 という同値の概念をサポートしています.2つの辞書に同じキーセットが含まれている場合は、 d1 == d2 となります。

だから、あなたが何ができるかである、

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

あなたは> < >= <=

を行うことはできませんしかし、これは、Python 2にしかし、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() 
>>> 

では、見てみましょうこれは、

>>> a = {2:2} 
>>> b = {2:2} 
>>> a==b 
True 
>>> a<b 
False 
>>> a>b 
False 
最初 dictの値が大きい場合

しかしkeyが同じであり、valueが同じであればvalue

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

再び異なる場合、

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

しかし、これに気づく

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

今まで我々は同じだったkey異なるvalues今キーがチェックされ、それは同じだ場合にのみ、、値のいずれかのPython 2、あなたはここから何を得ることができます別のキー

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

同じ値、のは、それを変更しましょうチェックされます。さまざまなキーと異なる値を設定しましょう。

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

Aha!この場合、keyが最初にチェックされるものであることを推測でき、それらが同じ場合にのみ値がチェックされます。さあ、我々の辞書にkey:valueのペアが複数あるとしましょう?

>>> 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 

つまり、 keyがすべてチェックされ、keyが同じ値である場合にチェックされます。ああ、キーチェックはどのように機能しますか?すなわちdict_compare source code

メモを見てとるため:はメソッドCMP()は2つの数の差の符号を返し:-1であれば、X < Y、0のx == yまたは1の場合であればX> Y

ですから、基本的にAとBのDictを比較すると、長さが最初に比較されます(問題ありません)。それらが等しくない場合は、cmp(len(A)、len(B))を返します。

次に、検索最小のキーであるAにおけるキーakeyれる

akey not in B or A[akey] != B[akey] - >(AKEYがBに存在する場合にのみこれが起こります)。

(そのようなキーが存在しない場合、dictsが等しい。)

また

bkey not in A 又はA[bkey] != B[bkey]ためのBにおける最小キーBKEY見つける(しなければならない) - >(これをbkeyにbkeyが存在する場合にのみ発生します)。

akey!= bkeyの場合、cmp(akey、bkey)を返します。他戻りCMP([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 

だからAでないBにおける最小キーが200同様1Aです。

内部pythonは上記のアルゴリズムに従ってそれらを比較しますので、a>bを実行するとcmp(200,1)が計算されます。それ以外の場合はcmp(1,200)a<bが行われます。

しかし、これは、これらのdictsに等しい長さを有するので、これは、Python 3に

関連する問題