几天前我刚开始使用python 3。编程时,我遇到了奇怪的情况
a = [
[5, [[1, 1, None], [None, None, None], [None, None, None]]],
[5, [[1, None, 1], [None, None, None], [None, None, None]]]
]
max(a)
给了我
Traceback(最近一次调用最后一次):文件“”,第1行,in TypeError:unorderable类型:NoneType()> INT()
但如果我尝试
a = [
[5, [[1, 1, None], [None, None, None], [None, None, None]]],
[5.1, [[1, None, 1], [None, None, None], [None, None, None]]]
]
max(a)
显示
[5.1, [[1, None, 1], [None, None, None], [None, None, None]]]
这种行为的任何特殊原因?
更新1: 我尝试了不同的东西
a = [[5, [[1,2], [3,4]]],[5,[[3,4],[5,10]]],[5,[[5,6],[7,8]]]]
且max(a)
为[5, [[5, 6], [7, 8]]]
我怀疑为什么在这种情况下没有显示错误?
答案 0 :(得分:6)
这是因为max
在遇到无值时执行此操作:
max([1, None])
也会出现同样的错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-14-c33cf47436bc> in <module>()
----> 1 max([1,None])
TypeError: unorderable types: NoneType() > int()
基本上,max试图迭代列表并首先找出更大的值。但是当它达到无时,它不能再进行比较,因此抛出错误。
带
a = [
[5, [[1, 1, None], [None, None, None], [None, None, None]]],
[5.1, [[1, None, 1], [None, None, None], [None, None, None]]]
]
它比较5和5.1,并将列表与5.1视为更大。
当两个第一个值均为5时,它会迭代下一个项目并遇到导致错误的None
。
更新
此示例可能有助于更好地澄清错误消息:
max([1,'2'])
错误:
TypeError: unorderable types: str() > int()
基本上它试图比较'2' with 1
并给出TypeError: unorderable types: str() > int()
之前我们正在比较None with int() 1
,我们得到的错误消息是TypeError: unorderable types: NoneType() > int()
答案 1 :(得分:3)
在Python 2中,这种None
技巧比较低于任何整数在某些情况下是有用的,当你需要一个你无法预测的最小值时(因为整数没有固定的最小值/最大值)在C)。
在Python 3中,这是不可能的(并且大部分时间都是最好的,例如,在将字符串与"2"
和3之类的整数进行比较时,可以省去很多麻烦。
如果你真的需要,我想到了一个解决方法。
您可以定义一个低于任何其他对象的类,并使用该类的实例而不是None
:
class AM:
def __int__(self):
return 0
def __gt__(self,other):
return False
def __repr__(self):
return "INF" # prints out nicely
always_min = AM()
a = [
[5, [[1, 1, always_min], [always_min, always_min, always_min]]],
[5, [[1, always_min, 1], [always_min, always_min, always_min]]]
]
print(max(a))
我明白了:
[5, [[1, 1, INF], [INF, INF, INF]]]
证明抢七有效。
请注意,这是一个最小的实现。 max
仅使用&gt;:仅定义__gt__
是懒惰的,我们需要相应地定义其他__ge__
,__le__
,__lt__
以用于一般用法。