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