Python 字典和实现

Python 字典和实现,python,python-2.7,dictionary,default,Python,Python 2.7,Dictionary,Default,我一直在试验Python字典,发现\uugt\uuuuu和\uu lt\uuuu是为字典实现的 我已经对它们进行了测试,它们似乎以某种方式比较了键,但我不太清楚这是如何做到的;例如,我不太确定{1:1}>{0':0}如何返回False(事实上,'0'>100000也返回True) 是否有关于这两个功能实现的详细说明文件?该文件有详细说明。特别是: 不同类型的对象,除了不同的数字类型和不同的字符串类型外,从不进行相等比较;这些对象的排序是一致的,但却是任意的(因此,对异构数组进行排序会产生一致的结

我一直在试验Python字典,发现
\uugt\uuuuu
\uu lt\uuuu
是为字典实现的

我已经对它们进行了测试,它们似乎以某种方式比较了键,但我不太清楚这是如何做到的;例如,我不太确定
{1:1}>{0':0}
如何返回
False
(事实上,
'0'>100000
也返回
True

是否有关于这两个功能实现的详细说明文件?

该文件有详细说明。特别是:

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

行为的原因如下:

>>> '0' < 0
False
>>> 0 < '0'
True

具体而言,词典的分类如下:

d1 > d2
变成:

(len(d1) > len(d2) or 
 (len(d1) == len(d2) and
  sorted(d1.items()) > sorted(d2.items()))
(您可以在中看到这一点)。因此,如果它们的长度不相同,“长”一个就“大”:

如果它们有匹配的键,则具有“较大”值的键为“较大”:

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


只有在Python2.x中—在3.x中,您才能得到
TypeError:unorderable类型:dict()>dict()
。您的问题是关于字典比较,还是为什么字符串“大于”数字?在python repr(python 2.7.9 Anaconda 2.2.0)中,我可以键入以下代码:
tmp1=dict();tmp2=dict();tmp1[1]=1;tmp2['1']=2;tmp2>tmp1
并返回
True
。。。我不太清楚这是怎么做到的…字典的关键字在比较之前是如何排序的?如中所示,如果我创建一个包含混合类型关键字(str、int等)的字典,那么什么关键字与什么关键字相比较?它并不完全等同于
sorted(d1.items())>sorted(d2.items())
;首先比较长度。在项目比较之前,它必须进行键比较,如:
sorted(d1.keys())>sorted(d2.keys())
。例如
{'1':1}>{1:1}
返回
True
,而
{1:1}>{'1':1}
返回
False
。我猜这个实现包含了类似于
如果排序(self.keys())==sorted(other.keys())那么:返回排序(self.keys())>sorted(other.keys())
@lorenzo特洛伊木马:你是否混淆了
项()
值()
?@lorenzo特洛伊木马不,它没有“进行密钥比较”<代码>项包括键和值。如果您想查看CPython的实际实现,请转到源代码。
(len(d1) > len(d2) or 
 (len(d1) == len(d2) and
  sorted(d1.items()) > sorted(d2.items()))
>>> {1: 2, 3: 4} > {1: 2}
True
>>> {1: 2} > {1: 1}
True
>>> {1: 2} > {2: 1}
False