【问题标题】:Python3 porting: TypeError: unorderable types: dict() < int()Python3 移植:TypeError:不可排序的类型:dict() < int()
【发布时间】:2011-12-23 07:50:55
【问题描述】:

我有这段代码在 python 2.7 中运行良好。 “dist”是一个数字字典,“min_dist”只是一个数字。

for v in vertices:
    if dist[v.node_id] < min_dist:
        min_dist = dist[v.node_id]
        cur_min = v

现在我试图在 python 3.2 下运行它,它给了我这个错误:

    if dist[v.node_id] < min_dist:
TypeError: unorderable types: dict() < int()

我在 python 3.2 中的代码有什么问题?

【问题讨论】:

  • 如果 dist[v.node_id] 是字典,您可以将 if dist[v.node_id] &lt; min_dist: 替换为 if False: 并且程序应该仍然可以工作。如果是这样,您当然可以删除整个块,因为它永远不会被执行。
  • 啊,这部分代码确实被执行了,但是其他地方有一段代码用 { } 初始化(错误地)dist[v.node_id],因此出现了问题。代码的所有其他部分都使用数字正确初始化。
  • 我有完全相同的错误以完全相同的方式出现,所以你并不孤单 ;-) 看到这个让我可以快速修复它!

标签: python python-3.x porting


【解决方案1】:

您的代码在 Python 2 中也是“错误的”。将字典与整数进行比较是没有意义的。这就像问颜色是否大于数字一样,根本没有意义。

Python 2 允许像这样比较不同类型,并且总是说字典大于数字,这是任意的。即使是空字典也比数字大:

>>> import sys
>>> {} > sys.maxint
True

这样的比较是没有意义的,而 Python 3 反而正确地引发和错误,实际上是在说“我不知道你的意思”,这要好得多,并且可以避免错误的比较。

【讨论】:

  • 谢谢。您的解释帮助我找到了问题的根源。
【解决方案2】:

dist 不是“数字字典”,它是数字字典的字典。即使在 2.x 中,您的代码也不应该工作。

【讨论】:

  • 是的,我的代码在 python 2.7 中运行。我刚刚再次确认。
  • 那你在别处搞砸了移植。
  • 你是对的。我在别的地方搞砸了。由于 Lennart 解释的原因,代码在 2.7 中仍然“有效”。
  • 哈哈哈......即使有这个问题,它也恰好给了我正确的结果,并且只有在 python3 中问题变得更加明显。感谢您的帮助。
猜你喜欢
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
相关资源
最近更新 更多