我被问到是否可以在不调用运算符的情况下比较两个(比方说)列表,以确定它们是否相同(或者更确切地说,包含相同的元素)。
我首先使用
娱乐x in y
在我意识到它不关心秩序之前,仅仅是为了存在。当然,如果列表包含纯数字,那么进行模数测试会很简单,但列表可以包含字符串。 (也没有用,但考虑到测试身份,我并没有真正期待它。)
所以我想知道是否(甚至)可以在不使用运算符的情况下完成相等测试(==,!=)?
这只是一个修辞问题,但它已经啃了我一段时间了,我宁愿放弃尝试用我不太广泛的蟒蛇知识来解决它。
答案 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"