【问题标题】:Confusion with comparison error与比较错误混淆
【发布时间】:2017-01-24 21:33:42
【问题描述】:

当我运行以下内容时

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))

我得到了错误 TypeError: unorderable types: int() > list() 在第 4 行。当我尝试获取两个成员的 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 个整数,因此我很难理解如何处理最初陈述的错误。

【问题讨论】:

  • 你认为len(m) 是做什么的?它计算列表的长度...然后您完全忽略
  • ?.... 它只是为了查看我是否收到错误,因为它不适用于数字数据类型,因此当编译器声明存在时,我会混淆为什么我会收到错误1 在比较中
  • Python 内置了高效的max 函数,无需自己编写。但是,如果您想为学习目的编写自己的代码,最好给它起一个不同的名称。
  • 您对item[0] > m 有什么期待?一件事是一个列表,另一件事是一个整数。您给出的错误信息都与此一致。比较应该给出什么结果? “我有点确定你可以比较 2 个整数” - 是的,但这不是你在做的。
  • 您没有告诉我们您希望您的代码做什么。您只想在L 中查找第一个元素最大的子列表吗?

标签: python list int comparison


【解决方案1】:

正如 Moses Koledoye 所说,您会收到 TypeError: unorderable types: int() > list() 错误,因为循环中的第一个分配将整个 item 分配给 m,所以下次您尝试比较时,您正在比较列表 @987654324 @ 与整数 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] 也是如此。 2 个列表的长度不必相同; [30, 20, 0] > [30, 20] 计算结果为 True

所以你可以这样做

m = max(L)

但使用itemgetter 更好(并且可能更有效),因为它明确表示只比较子列表的第一个元素。

【讨论】:

    【解决方案2】:

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

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

    简单地说,如果您正在寻找一个全局最大值,您可以简单地 flatten 列表并简化此操作。

    【讨论】:

      猜你喜欢
      • 2019-12-29
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 2014-04-22
      • 2011-08-15
      • 2014-06-03
      • 2016-03-19
      相关资源
      最近更新 更多