没有使用运算符的平等

时间:2014-02-19 17:48:55

标签: python python-2.7 operators equality

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

我首先使用

娱乐
x in y

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

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

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

2 个答案:

答案 0 :(得分:9)

确实是这样,只需绕过操作员并直接进入__eq__特殊方法:

>>> x = [1, 2, 3]
>>> y = [1, 2, 3]
>>> x.__eq__(y)
True
>>> z = [42]
>>> x.__eq__(z)
False

您还可以使用operator module

>>> import operator
>>> operator.eq(x, y)
True
>>> operator.eq(x, z)
False

在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

这是有效的,因为cmp()会返回0的相等值。仅当所有结果均为假(例如0)时,any()才会返回False

地狱,直接前往cmp() ,不用循环:

>>> not cmp(x, y)
True
>>> not cmp(x, z)
False

对于Python 3,如果要避免使用cmp()和{{1}也是运营商。

对于只有整数的列表,您可以放弃.__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

答案 1 :(得分:0)

除了Martijn Pieters的回答,我可以想到以下选项:

使用XOR:

x = [1, 2, 3]
y = [1, 2, 3]
result = "list equal"
if len(x)-len(y):
    result = "list not equal"
else:
    for i,j in zip(x,y):
        if i ^ j: 
            result = "list is not equal"
            break
print result

使用set:

if set(x).difference(set(y)):
    print "list not equal"
else:
    print "list equal"