程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

python set contains vs. list contains

发布于2019-10-07 11:09     阅读(1312)     评论(0)     点赞(14)     收藏(5)


我正在使用python 2.7

考虑以下代码片段(该示例是人为设计的):

import datetime

class ScheduleData:
    def __init__(self, date):
        self.date = date

    def __eq__(self, other):
        try:
            return self.date == other.date
        except AttributeError as e:
            return self.date == other

    def __hash__(self):
        return hash(self.date)



schedule_set = set()
schedule_set.add(ScheduleData(datetime.date(2010, 8, 7)))
schedule_set.add(ScheduleData(datetime.date(2010, 8, 8)))
schedule_set.add(ScheduleData(datetime.date(2010, 8, 9)))

print (datetime.date(2010, 8, 8) in schedule_set)

schedule_list = list(schedule_set)

print (datetime.date(2010, 8, 8) in schedule_list)

的输出是意外的(至少对我而言):

[08:02 PM toolscripts]$ python test.py
True
False

在第一种情况下,schedule_set因为我已覆盖__hash____eq__函数,所以在中找到了给定的日期

根据我的理解,in运算符将检查集的哈希和相等性,但对于列表,它将仅对列表中的项目进行迭代并检查相等性。

那么这是怎么回事?为什么in列表中的第二项测试schedule_list失败?

我是否必须重写列表的其他功能?


解决方案


问题在于比较调用的__eq__功能与您要查找功能相反。__eq__当您有一个,ScheduleData() == datetime.date()in运算符以相反的顺序执行比较时,定义方法起作用datetime.date() == ScheduleData()这不会调用您的define __eq__只有充当左侧的类__eq__被调用。

此问题在python 2中发生的原因,而不是datetime.date.__eq__在std库中的定义与3 有关。以以下两个类为例:

class A(object):
    def __eq__(self, other):
        print ('A.__eq__')
        return False

class B(object):
    def __eq__(self, other):
        print ('B.__eq__')

items = [A()]
B() in items

B.__eq__在Python 2和Python 3上均可运行此代码。该B对象用作lhs,就像您的datetime.date对象在Python 2中使用一样。但是,如果我重新定义B.__eq__类似于Python 3的定义datetime.date.__eq__

class B(object):
    def __eq__(self, other):
        print ('First B.__eq__')
        if isinstance(self, other.__class__):
            print ('B.__eq__')
        return NotImplemented

然后:

First B.__eq__
A.__eq__ 

在Python 2和3下都打印。返回的NotImplemented原因导致检查的参数相反。

timetuple 正如@TimPeters所说(在我所不知道的有趣的怪癖中),在您的课程中使用将解决此问题,尽管似乎它不一定是一个函数

class ScheduleData:
    timetuple = None

除了您已经拥有的之外,您还需要什么。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/132166/8d636736f6c45e424523/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

14 0
收藏该文
已收藏

评论内容:(最多支持255个字符)