Python 2.7 Python3 max函数使用defaultdict中的值作为键不起作用

Python 2.7 Python3 max函数使用defaultdict中的值作为键不起作用,python-2.7,python-3.x,Python 2.7,Python 3.x,假设model是defaultdict,而num是set >>> model >>> defaultdict(<function <lambda> at 0x11076f758>, {1: 3, 2: 2, 4: 1}) >>> num >>> {1, 2, 3, 4, 5, 6} 但是它在Python3中不起作用 >>> # python 3.3.3 >>> m

假设
model
defaultdict
,而
num
set

>>> model
>>> defaultdict(<function <lambda> at 0x11076f758>, {1: 3, 2: 2, 4: 1})
>>> num
>>> {1, 2, 3, 4, 5, 6}
但是它在Python3中不起作用

>>> # python 3.3.3
>>> max(num, key=model.get)
>>> TypeError: unorderable types: NoneType() > int()
我可以使用
max(num,key=lambda k:model[k])
让它在
Python3
中工作,但是如果
num
中的项不在
模型中,它将被添加。这将修改
模型


我想知道为什么
model.get
Python3
中不起作用,我如何在不修改
model
的情况下使用
key=lambda x:model.get(x,0)


defaultdict.get
默认情况下,如果未找到项,则返回None。Python2允许对不同类型进行有序比较(如小于和大于),但Python3不允许。当Python3尝试查找最大值时,它会尝试查看一个键的值是否大于另一个键的值。如果其中一个值为None,则它将失败,并出现您看到的错误。解决方案是让您的键函数返回零,而不是为缺失值返回零。

另一个后续问题,为什么
Python 3
不允许对不同类型进行有序比较?
float(“-inf”)
可能是更好的默认值,因为没有任何小于该值的整数,但是有几个在
0
@mitchellc以下:基本上,因为它们没有意义。没有一个应该大于或小于数字1吗?字符串“Hello”是否大于或小于列表[3,4]?在Python 2中,答案是任意的,可能会导致奇怪的bug。@BrenBarn是的,这是有道理的。
>>> # python 3.3.3
>>> max(num, key=model.get)
>>> TypeError: unorderable types: NoneType() > int()