当我运行以下
时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个整数,我很难理解如何处理最初所述的错误。
答案 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
会更好(并且可能更有效),因为它明确地说只是通过第一个元素来比较子列表。