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

时间:2014-01-21 19:56:22

标签: python-2.7 python-3.x

假设modeldefaultdict,而numset

>>> 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.getPython3中不起作用,以及如何在不修改model的情况下执行此操作。

1 个答案:

答案 0 :(得分:5)

使用key=lambda x: model.get(x, 0)

如果找不到该项,

defaultdict.get默认返回None。 Python 2允许在不同类型上进行有序比较(如小于和大于),但Python 3则不然。当Python 3试图找到最大值时,它会尝试查看一个键的值是否大于另一个键。如果其中一个值为None,则会因您看到的错误而失败。解决方案是使您的键函数返回零而不是缺少值的无。