字典__gt__和__lt__实现

Lor*_*jan 6 python dictionary default python-2.7

我一直在试验Python词典,并发现__gt____lt__为字典实现.

我已经对它们进行了测试,看起来它们在某种程度上比较了键,但我不清楚它是如何完成的; 例如,我不太确定如何{1: 1} > {'0': 0}返回False(事实上​​,'0' > 100000返回True也是如此).

是否有任何关于这两个功能实施细节的文件?

jon*_*rpe 6

该文档有一个关于比较部分.特别是:

除了不同的数字类型和不同的字符串类型之外,不同类型的对象永远不会相等; 这些对象是一致但任意排序的(因此排序异构数组会产生一致的结果).

行为的原因如下:

>>> '0' < 0
False
>>> 0 < '0'
True
Run Code Online (Sandbox Code Playgroud)

在CPython中,选择的"始终但任意"的比较方法是按类型名称按字母顺序排序,并且'str' > 'int':

CPython实现细节:除了数字之外的不同类型的对象按其类型名称排序; 不支持正确比较的相同类型的对象按其地址排序.

对Python 3.x更改了此行为,您无法再比较异构类型(或字典,就此而言):

>>> '0' > 0
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    '0' > 0
TypeError: unorderable types: str() > int()
>>> {'a': None} > {'b': None}
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    {'a': None} > {'b': None}
TypeError: unorderable types: dict() > dict()
Run Code Online (Sandbox Code Playgroud)

就字典而言,它们的排序方式如下:

d1 > d2
Run Code Online (Sandbox Code Playgroud)

变为:

(len(d1) > len(d2) or 
 (len(d1) == len(d2) and
  sorted(d1.items()) > sorted(d2.items()))
Run Code Online (Sandbox Code Playgroud)

(你可以在CPython源代码中看到这个).因此,如果长度不同,则"较长"的长度为"较大":

>>> {1: 2, 3: 4} > {1: 2}
True
Run Code Online (Sandbox Code Playgroud)

如果它们具有匹配的键,则具有"较大"值的键是"较大"的:

>>> {1: 2} > {1: 1}
True
Run Code Online (Sandbox Code Playgroud)

如果它们具有不匹配的键,则具有"较大"键的键"较大":

>>> {1: 2} > {2: 1}
False
Run Code Online (Sandbox Code Playgroud)