假设model
是defaultdict
,而num
是set
>>> model
>>> defaultdict(<function <lambda> at 0x11076f758>, {1: 3, 2: 2, 4: 1})
>>> num
>>> {1, 2, 3, 4, 5, 6}
我想从num
获取model
中具有最大值的项目,以下代码在Python2
>>> # python 2.7.6
>>> max(num, key=model.get)
>>> 1
但它在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
中,则会添加该项目。这将修改model
。
我想知道为什么model.get
在Python3
中不起作用,以及如何在不修改model
的情况下执行此操作。
答案 0 :(得分:5)
使用key=lambda x: model.get(x, 0)
。
defaultdict.get
默认返回None。 Python 2允许在不同类型上进行有序比较(如小于和大于),但Python 3则不然。当Python 3试图找到最大值时,它会尝试查看一个键的值是否大于另一个键。如果其中一个值为None,则会因您看到的错误而失败。解决方案是使您的键函数返回零而不是缺少值的无。