Python无法解决的类型:NoneType()>找到列表的最大值

时间:2017-03-04 09:58:45

标签: python python-3.x

几天前我刚开始使用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]]] 我怀疑为什么在这种情况下没有显示错误?

2 个答案:

答案 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__以用于一般用法。