Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t在循环期间添加相同的对象之前,请先检查列表中是否有对象_Python_List_Loops_Class_Oop - Fatal编程技术网

Python Can';t在循环期间添加相同的对象之前,请先检查列表中是否有对象

Python Can';t在循环期间添加相同的对象之前,请先检查列表中是否有对象,python,list,loops,class,oop,Python,List,Loops,Class,Oop,我从文件doctor_data.txt中提取一个数据,从每一行创建一个对象,无论它们属于父类doctor的Private或State子类(如果该行有四个浮动,包括奖金支付Private,如果不是,则为State)。创建类之后,我编写了一个程序,将每个私有或状态doctor对象添加到列表doctorList=[],除非从数据行创建的对象已经存在于列表中 我的循环将每个对象添加到列表中没有任何问题,但无法检查该对象是否已经存在。如何解决这个问题 末端的循环部分: doctor_data = open

我从文件doctor_data.txt中提取一个数据,从每一行创建一个对象,无论它们属于父类doctor的Private或State子类(如果该行有四个浮动,包括奖金支付Private,如果不是,则为State)。创建类之后,我编写了一个程序,将每个私有或状态doctor对象添加到列表
doctorList=[]
,除非从数据行创建的对象已经存在于列表中

我的循环将每个对象添加到列表中没有任何问题,但无法检查该对象是否已经存在。如何解决这个问题

末端的循环部分:

doctor_data = open('/Users/berketurer/Desktop/doctor_data.txt', 'r')
doctorList = []

for line in doctor_data:
    data = line.split(";")


    if len(data) == 4:
        dname, title, patients, treatmentFee = data
        patients, treatmentFee = float(patients), float(treatmentFee)
        doc_obj = Private(dname, title, patients, treatmentFee)

    elif len(data) == 3:
        dname, title, salary = data
        salary = float(salary)
        doc_obj = State(dname, title, salary)

    if doc_obj not in doctorList: #no idea about why it doesn't understand Alyysa occurs twice.
        doctorList.append(doc_obj)
输出:

runfile('/Users/berketurer/Desktop/Lab__Berke_Turer.py', wdir='/Users/berketurer/Desktop')
[Assistant Professor - Alonzo Ballard Payment: 9250.0
, Assistant Professor - Tracey Russell Payment: 90000.0
, Associate Professor - Andrea Howard Payment: 20000.0
, Associate Professor - Rosalie West Payment: 35000.0
, Associate Professor - Sue Beck Payment: 139500.0
, Professor - Alyssa Padilla Payment: 150000.0 #twice
, Professor - Alyssa Padilla Payment: 150000.0 #twice
, Professor - Darryl Walker Payment: 100000.0
, Professor - Jeremiah Bailey Payment: 24750.0
, Specialist - Andrew Austin Payment: 12750.0
, Specialist - Lyle Romero Payment: 10250.0
]
完整代码:

class Doctor:

    def __init__(self, dname, title):
        self.__dname = dname
        self.__title = title

    def get_dname(self):
        return self.__dname
    def get_title(self):
        return self.__title

    def set_dname(self, newname):
        self.__dname = newname
    def set_title(self, newtitle):
        self.__title = newtitle

    def __eq__(self, other):
        if self.__dname == self.__title and other.__dname and other.__title:
            return True

    def __lt__(self, other):
        if self.__title < other.__title:
            return True
        elif self.__title == other.__title:
            if self.__dname < other.__dname:
                return True
        else:
            return False

    def __repr__(self):
        return "{} - {}".format(self.__title, self.__dname)


class Private(Doctor):

    def __init__(self, dname, title, patients, treatmentFee):
        Doctor.__init__(self, dname, title)
        self.__patients = patients
        self.__treatmentFee = treatmentFee

    def calculate_payment(self):
        self.__payment = self.__patients * self.__treatmentFee
        return self.__payment


    def __repr__(self):
        return "{} - {} Payment: {}\n".format(self.get_title(), self.get_dname(), self.calculate_payment())


class State(Doctor):

    def __init__(self, dname, title, salary):
        Doctor.__init__(self, dname, title)
        self.__salary = salary
        self.__baseBonus = 5000
        self.__payment = 0        

    def calculate_payment(self):

        if self.get_title() == "Professor" :
            self.__payment = self.__salary + self.__baseBonus * 1.25
            return self.__payment

        elif self.get_title() == "Associate Professor" : 
            self.__payment = self.__salary + self.__baseBonus
            return self.__payment

        elif self.get_title() == "Assistant Professor" or self.get_title() == "Specialist":
            self.__payment = self.__salary + self.__baseBonus * 0.75
            return self.__payment

    def __repr__(self):
        return "{} - {} Payment: {}\n".format(self.get_title(), self.get_dname(), self.calculate_payment())

doctor_data = open('/Users/berketurer/Desktop/doctor_data.txt', 'r')
doctorList = []

for line in doctor_data:
    data = line.split(";")

    if len(data) == 4:
        dname, title, patients, treatmentFee = data
        patients, treatmentFee = float(patients), float(treatmentFee)
        doc_obj = Private(dname, title, patients, treatmentFee)

    elif len(data) == 3:
        dname, title, salary = data
        salary = float(salary)
        doc_obj = State(dname, title, salary)

    if doc_obj not in doctorList: #no idea about why it doesn't understand Alyysa occurs twice.
        doctorList.append(doc_obj)

doctorList.sort()
print(doctorList)
class博士:
定义初始化(self、dname、title):
self.\uu dname=dname
self.\uu title=标题
def get_dname(自我):
返回自我名称
def get_标题(自我):
返回自我。\u标题
def set_dname(self,newname):
self.\uu dname=newname
def set_标题(自身,新标题):
self.\uu title=newtitle
定义(自身、其他):
如果self.\uuuu dname==self.\uuuuu title和other.\uuuuu dname和other.\uuuuu title:
返回真值
定义(自身、其他):
如果自身标题<其他标题:
返回真值
elif self.\uuuu title==其他.\uuuu title:
如果自我名称<其他名称:
返回真值
其他:
返回错误
定义报告(自我):
返回“{}-{}”。格式(self.\u title,self.\u dname)
私人班级(医生):
定义初始(自我、姓名、头衔、患者、治疗费):
博士(自我、姓名、职称)
自我。患者=患者
自我治疗费=治疗费
def计算_付款(自付):
自付=自付患者*自付治疗费
返回自付
定义报告(自我):
返回“{}-{}付款:{}\n”。格式(self.get\u title(),self.get\u dname(),self.calculate\u Payment())
班级状态(医生):
定义初始(自我、姓名、职称、薪水):
博士(自我、姓名、职称)
自付工资=工资
自我奖金=5000
自付=0
def计算_付款(自付):
如果self.get_title()=“教授”:
自付=自付工资+自付基本奖金*1.25
返回自付
elif self.get_title()=“副教授”:
自付=自付工资+自付奖金
返回自付
elif self.get_title()=“助理教授”或self.get_title()=“专家”:
自付=自付工资+自付基本奖金*0.75
返回自付
定义报告(自我):
返回“{}-{}付款:{}\n”。格式(self.get\u title(),self.get\u dname(),self.calculate\u Payment())
doctor_data=open('/Users/berketurer/Desktop/doctor_data.txt',r')
doctorList=[]
对于doctor_数据中的行:
数据=行。拆分(“;”)
如果len(数据)==4:
数据名称、职称、患者、治疗费=数据
患者,治疗费=浮动(患者),浮动(治疗费)
doc_obj=私人(姓名、头衔、患者、治疗费)
elif len(数据)==3:
dname、title、salary=数据
工资=浮动(工资)
doc_obj=状态(姓名、职务、工资)
如果doc_obj不在doctorList中:#不知道为什么它不理解Alyysa出现两次。
doctorList.append(doc_obj)
doctorList.sort()
打印(医生列表)

问题在于等式当前正在检查它们是否是内存中的同一对象,这是错误的。为了克服这个问题,您需要在Doctor中定义一个自定义的相等类。请看or中的uu eq_u_u方法

对象列表上的
in
操作符检查实例中是否有不相同的内容。当您创建
Private
State
的实例时,它会收到一个新的唯一内部标识符,这是
中的
操作员试图找到的。因此,即使两个对象的内容相同,它们的标识符也会不同

您需要创建一个比较函数,该函数将考虑比较中每个对象的每个字段(可能会变得复杂),或者只需从输入中排除重复的行:

例如:

如果任何地方都可能发生重复

seenLine = set()
for line in doctor_data:
   if line in seenLine: continue
   seenLine.add(line)
   # ...
如果重复项总是连续的

previousLine = None
for line in doctor_data:
   if line == previousLine: continue
   previousLine = line
   # ...

重复可以发生在任何地方。。。你说的seenLine=set()到底是什么意思?set()是一种列表,它只保存每个项目的一个副本。搜索速度也非常快,因此您可以使用它跟踪您已经看到的行,并对照它检查以跳过重复的行。循环似乎并不关心seenLine checker,我尝试了continue和break语句。它创建了一个具有适当用途的集合,这些行在集合中没有重复。这些行可能有一点不同(例如,一个额外的空间),这使得它们不同,而数据实际上是相同的。您可以尝试在分号上拆分行之后构建一个比较键,并根据seenLine而不是原始数据检查它。例如:
lineKey=“;”.join(s.strip()表示数据中的s);如果在seenLine中输入lineKey:继续;请参见行。添加(行键)