Ara*_*shi 1 python equality operators python-2.7
我被问到是否可以在不调用运算符的情况下比较两个(比方说)列表,以确定它们是否相同(或者更确切地说,包含相同的元素).
我首先使用了
x in y
Run Code Online (Sandbox Code Playgroud)
在我意识到它不关心秩序之前,仅仅是为了存在.当然,如果列表包含纯数字,那么进行模数测试会很简单,但列表可以包含字符串.(也没用,但考虑到测试身份,我并没有真正期待它...)
所以我想知道是否(甚至)可以在不使用运算符(==,!=)的情况下完成相等测试?
这只是一个修辞问题,但它已经啃了我一段时间,我宁愿放弃尝试用我不太广泛的python知识解决它.
当然,只是绕过操作员直接进入__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.
| 归档时间: |
|
| 查看次数: |
199 次 |
| 最近记录: |