私はこの出くわし:比較演算子は辞書で何をしますか?
>>> d1 = {"john":40, "peter":45}
>>> d2 = {"john":466, "peter":45}
>>> d1 > d2
False
何を比較演算子2枚のdictsを比較しながら行うとどのようにそれがFalse
出力しますか?
私はこの出くわし:比較演算子は辞書で何をしますか?
>>> d1 = {"john":40, "peter":45}
>>> d2 = {"john":466, "peter":45}
>>> d1 > d2
False
何を比較演算子2枚のdictsを比較しながら行うとどのようにそれがFalse
出力しますか?
動作しないの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。
>>> 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
辞書は、セットのように、その要素に明確に定義された順序を維持しません。 はさらに、部分集合の概念は、辞書のための、典型的には意味がないので、 辞書クラスは
<
ような演算子をサポートしていません。辞書は、 という同値の概念をサポートしています.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
同様1
A
です。
内部pythonは上記のアルゴリズムに従ってそれらを比較しますので、a>b
を実行するとcmp(200,1)
が計算されます。それ以外の場合はcmp(1,200)
a<b
が行われます。
しかし、これは、これらのdictsに等しい長さを有するので、これは、Python 3に