Python:比较列表的语义

标签 python list rounding

大家。

我遇到了一个奇怪的问题,当我尝试比较两个相同的列表时,Python (2.7) 确定它们是不同的。它们嵌入在相当大的代码体中,但这里只是其中的一小部分。

print("innersearch:",innersearch)
print("innersub:",innersub)
if (innersearch == innersub):
     print("innersearch = innersub")
print("----")

不幸的是,这会返回:

innersearch: (-100.00,-0.00)
innersub: (-100.00,-0.00)
----

我知道这是一个模态问题,因为当我将 innersearchinnersub 替换为 (-100.00,-0.00) 时,我得到innersearch = insidesub。感谢任何帮助,并对我缺乏知识表示歉意。

更新:

有人建议我对这些值进行四舍五入,就像它们在比较之前输出时一样,不幸的是,这没有什么帮助。

innersub = turtle.Vec2D(round(innersub[0], 2), round(innersub[1], 2))
innersearch = turtle.Vec2D(round(innersearch[0], 2), round(innersearch[1], 2))
print("innersearch:",innersearch)
print("innersub:",innersub)
if (innersearch == innersub):
    print("innersearch = innersub")
print("----")

这返回了相同的结果。有什么想法吗?

最佳答案

当且仅当两个列表具有相同的长度并且第一个列表中的每个元素与第二个列表中的相应元素比较时,两个列表才被视为相等。大致是:

def lists_equals(l1, l2):
    if len(l1) != len(l2):
        return False
    return all(a == b for (a, b) in zip(l1, l2))

需要注意的重要一点是,相等语义不会自动为自定义类定义——或者更确切地说,它们默认为标识。在没有 __eq__ 方法的情况下,两个对象只有在相同对象时才会比较为相等(a == b 的行为与a是b)。

这意味着,如果您的列表包含您自己编写的类的实例,并且您希望能够比较这些列表,则所述类必须实现 __eq__,否则您的比较将不起作用。

关于Python:比较列表的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20291175/

相关文章:

python - 如何从 mongoengine 模型获取 id(不是 pk)?

python - 如何更快地遍历这个文本文件?

Python 3 read() from file 不适用于 1 字节文件

python - 基于另一个列表中每个索引的值的列表组合

python - python 获取字符串中某个字符前后的特定子字符串

javascript - Mootools:如何在鼠标悬停时在 `span` 元素内创建新元素 `li`?

python - 嵌套列表中的 curs.fetchall() python

c# - 像在 C# 中一样在 Javascript 中强制转换为 float

PowerShell [Math]::Round 有时不舍入?

PHP 舍入为整数