首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较itemgetter对象

比较itemgetter对象
EN

Stack Overflow用户
提问于 2012-04-02 10:36:44
回答 2查看 569关注 0票数 3

我注意到operator.itemgetter对象没有定义__eq__,所以它们的比较默认是检查身份(is)。

当两个itemgetter实例的初始化参数列表比较为相等时,将它们定义为相等有什么缺点吗?

下面是这种比较的一个用例。假设您定义了一个排序数据结构,其构造函数需要一个键函数来定义排序。假设您想检查两个这样的数据结构是否具有相同的关键功能(例如,在assert语句中;或者验证它们是否可以安全地合并;等等)。

当两个关键函数是itemgetter('id')时,如果我们能肯定地回答这个问题,那就太好了。但目前,itemgetter('id') == itemgetter('id')的评估结果为False

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-02 12:53:09

尼克拉斯的答案非常聪明,但需要一个更强的条件,因为itemgetter可以接受多个参数

代码语言:javascript
复制
from collections import defaultdict
from operator import itemgetter
from itertools import count

def cmp_getters(ig1, ig2):
   if any(not isinstance(x, itemgetter) for x in (ig1, ig2)):
      return False
   d1 = defaultdict(count().next)
   d2 = defaultdict(count().next)
   ig1(d1)                                 # populate d1 as a sideeffect
   ig2(d2)                                 # populate d2 as a sideeffect
   return d1==d2

一些测试用例

代码语言:javascript
复制
>>> cmp_getters(itemgetter('foo'), itemgetter('bar'))
False
>>> cmp_getters(itemgetter('foo'), itemgetter('bar','foo'))
False
>>> cmp_getters(itemgetter('foo','bar'), itemgetter('bar','foo'))
False
>>> cmp_getters(itemgetter('bar','foo'), itemgetter('bar','foo'))
True
票数 4
EN

Stack Overflow用户

发布于 2012-04-02 11:00:58

itemgetter返回一个可调用的。我希望你不想比较可调用的。对,是这样?因为即使您传递相同的参数,返回的可调用对象的id也不会被保证是相同的。

代码语言:javascript
复制
def fun(a):
    def bar(b):
        return a*b
    return bar

a = fun(10)
print id(a(10))

a = fun(10)
print id(a(10))

另一方面,当您使用可调用的itemgetter作为访问器访问底层对象时,将使用该对象的比较来执行比较,如Sorting Howto using the operating module functions中所示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9970278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档