与比较错误混淆

时间:2016-09-16 15:27:25

标签: python list int comparison

当我运行以下

def max(L):
    m = L[0][0]
    for item in L:
        if item[0] > m:
            m = item
    return m

L = [[20, 10], [10, 20], [30, 20],[12,16]]
print(max(L))

我收到错误  第{第4行TypeError: unorderable types: int() > list()。当我试图获得两个成员的len()时,就会产生混淆。因此,从错误消息中可以合理地假设m是列表,所以我运行

def max(L):
    m = L[0][0]
    for item in L:
        len(m)
        if item[0] > m:
            m = item
    return m

L = [[20, 10], [10, 20], [30, 20],[12,16]]
print(max(L))

并获取错误len(m) TypeError: object of type 'int' has no len()。好的,唯一的选择是item[0]是列表......所以类似

def max(L):
    m = L[0][0]
    for item in L:
        len(item[0])
        if item[0] > m:
            m = item
    return m

L = [[20, 10], [10, 20], [30, 20],[12,16]]
print(max(L))

我得到了同样的错误:len(item[0]) TypeError: object of type 'int' has no len()。由于我有点确定你可以比较2个整数,我很难理解如何处理最初所述的错误。

2 个答案:

答案 0 :(得分:2)

for 循环的第一次迭代中,执行m = item会使m引用list,之后无法与int进行比较(即item[0] > m)在下一次迭代中。

您应该将m分配给item中的一个元素,比如说m = item[0](从每个子列表中的第一个元素中找到最大值),具体取决于您想要计算的精确程度你的最大价值。

从较轻松的角度来说,如果您正在寻找全局最大值,您可以简单地flatten列表并使其更容易。

答案 1 :(得分:0)

正如Moses Koledoye所说,你得到TypeError: unorderable types: int() > list()错误,因为循环中的第一个作业将整个item分配给m,所以下次你试图比较你时将列表m与整数item[0]进行比较。因此,您只需将item[0]分配给m即可。像这样:

def max0(L):
    m = L[0][0]
    for item in L:
        if item[0] > m:
            m = item[0]
    return m

L = [[20, 10], [10, 20], [30, 20], [12, 16]]
print(max0(L))

<强>输出

30

但是有一种更好的方法:使用内置的max和一个键函数来抓取传递给`max。

的序列中每个列表的第一个元素。
from operator import itemgetter

L = [[20, 10], [10, 20], [30, 20], [12, 16]]
m = max(L, key=itemgetter(0))
print(m)

<强>输出

[30, 20]

您也可以使用简单的lambda功能执行此操作,而不是导入itemgetter,但itemgetter效率更高。

m = max(L, key=lambda u:u[0])

事实上,你并不需要在这里提供关键功能,因为Python会愉快地比较2个列表(或元组)。它比较两个列表中的相应元素,一旦找到一对不相等的元素就立即停止。因此[30, 20] > [30, 19]评估为True[30, 20] > [29, 1000]评估为[30, 20, 0] > [30, 20]。 2个列表的长度不必相同; True评估为m = max(L)

所以你可以做到

itemgetter

但是使用using会更好(并且可能更有效),因为它明确地说只是通过第一个元素来比较子列表。