没有使用运算符的平等

Ara*_*shi 1 python equality operators python-2.7

我被问到是否可以在不调用运算符的情况下比较两个(比方说)列表,以确定它们是否相同(或者更确切地说,包含相同的元素).

我首先使用了

x in y
Run Code Online (Sandbox Code Playgroud)

在我意识到它不关心秩序之前,仅仅是为了存在.当然,如果列表包含纯数字,那么进行模数测试会很简单,但列表可以包含字符串.(也没用,但考虑到测试身份,我并没有真正期待它...)

所以我想知道是否(甚至)可以在不使用运算符(==,!=)的情况下完成相等测试?

这只是一个修辞问题,但它已经啃了我一段时间,我宁愿放弃尝试用我不太广泛的python知识解决它.

Mar*_*ers 9

当然,只是绕过操作员直接进入__eq__特殊方法:

>>> x = [1, 2, 3]
>>> y = [1, 2, 3]
>>> x.__eq__(y)
True
>>> z = [42]
>>> x.__eq__(z)
False
Run Code Online (Sandbox Code Playgroud)

您也可以使用该operator模块:

>>> import operator
>>> operator.eq(x, y)
True
>>> operator.eq(x, z)
False
Run Code Online (Sandbox Code Playgroud)

在Python 2,你可以使用与循环any(),并cmp()itertools.izip_longest()以确保我们不会忽视长度不均匀:

>>> from itertools import izip_longest
>>> not any(cmp(i, j) for i, j in izip_longest(x, y, fillvalue=object()))
True
>>> not any(cmp(i, j) for i, j in izip_longest(x, z, fillvalue=object()))
False
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为cmp()返回0值相等的值.any()返回False只有当所有的结果都是假的(如0).

地狱,直接去cmp() 没有循环:

>>> not cmp(x, y)
True
>>> not cmp(x, z)
False
Run Code Online (Sandbox Code Playgroud)

对于Python 3,你必须创建自己的cmp()函数,也许使用.__lt__,.__gt__如果你想避免使用<>运算符.

对于只有整数的列表,您可以放弃该cmp()函数并直接进行减法; 让我们map()在这里使用并包括列表长度:

>>> not (len(x) - len(y)) and not any(map(lambda i, j: i - j, x, y))
True
>>> not (len(x) - len(z)) and not any(map(lambda i, j: i - j, x, z))
False
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为map()压缩列表中的值并将这些对传递给第一个参数,一个可调用的.这减去了值,只有当整数相等时,我们才能获得所有的0值和any()返回值False.