在Python中创建列表类

2024-09-29 19:20:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须从一堆XML文件中提取患者信息,以便进行进一步的数据分析。你知道吗

我有多个病人可以有多种疾病。对于每种疾病,可能有或可能没有一种或几种治疗方法。每次治疗可能有或可能没有治疗细节。治疗细节经常在文件中重复(例如,不同名称的文件,但是对于一种疾病或只是一个小的改变,相同的治疗细节)。你知道吗

我认为Patient[i].Disease[j].Treatment[k]类型的数据结构可能对这个问题有用。不幸的是,我不是很好的类或OOP。你知道吗

如何实现这种类型的数据结构Patient[i].Disease[j].Treatment[k]?你知道吗

下面是我的代码:

class PatientClass(object):

    def __init__(self):
        self.patient = []

    def addPatient(self, PatientID, casVersion):
        self.patient.append((False, PatientID, casVersion))

    def patient_count(self):
        return(len(self.patient))

    def printPatient(self):
        print(self.patient)

    def printpatientN(self,n):
        print(self.patient[n])

    def __str__(self,n):
        return(self.patient[n])

class Disease(PatientClass):

    def __init__(self):
        PatientClass.__init__(self)
        self.disease = []

    def addDisease(self, datetime_Start, datetime_End):
        self.disease.append((False, datetime_Start, datetime_End))


    def printDiseaseN(self,n):
        print(self.disease[n])

    def __str__(self,n):
        return "%s has disease %s" % (self.patient[n], self.disease[n])

Tags: 文件selfdatetimereturninitdef细节疾病
2条回答

您可以从“has-a”范例的简单实现开始:

    class Patient:

        def __init__(self, patientID, casVersion):
            self.patientID = patientID
            self.casVersion = casVersion
            self.disease = []

        def addDisease(self, disease):
            self.disease.append(disease)
            return self

        def __str__(self):
            return "<Patient: %s, casVer: %s, disease: %s>" % (self.patientID, self.casVersion, " ".join([str(d) for d in self.disease]))

    class Disease:

        def __init__(self, datetimeStart, datetimeEnd):
            self.datetimeStart = datetimeStart
            self.datetimeEnd = datetimeEnd
            self.treatment = []

        def __str__(self):
            return "<Disease: start: %s, end: %s, treatment: %s>" % (self.datetimeStart, self.datetimeEnd, " ".join([str(t) for t in self.treatment]))


# usage
print Patient("TheFirst", "Cas").addDisease(Disease("yesterday", "today"))

您可以利用内置的Python dict和/或list机制,使用非常简单的类来构造数据。下面是存储Patient对象的示例。它们是扩展的dicts-我选择dicts是因为它非常适合您随时可以添加所需字段作为新键的记录。我还使用标准dict来存储Patient对象,使用它们的记录id作为键来存储和检索容器patientsdict中的Patient对象

所示的简单类扩展了UserDict(从dict继承的正确方法),并为患者疾病和治疗提供了“has-a列表”概念。你知道吗

下面是一个使用示例,您可以看到通过继承可以获得许多内置的有用行为。你知道吗

您可以将此结构用于数据,或者根据您的喜好和需要对其进行调整(例如:您可能希望通过使用属性来定义对某些属性更简单的访问,即编写.name而不是['name'], 请参见here以获得简短的解释,或者您可以用其他方式扩展这些类)。你知道吗

super().__init(...)只是在添加更多属性的同时保留类的默认初始化,否则它们将无法正常工作,因为它们会覆盖默认值。Treatment不需要它,因为它没有重新定义__init__(现在)

from collections import UserDict
# see also UserList, UserString

class Treatment(UserDict):
    pass

class Disease(UserDict):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.treatments = []


class Patient(UserDict):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.diseases = []

patients = dict()

p1 = patients['0001'] = Patient(name='Eric', surname='Idle')

d1 = Disease(name='Eating too much')
t1 = Treatment(title='Radical Therapy', description='Mint pill after lunch.')
d1.treatments.append(t1)

d2 = Disease(name='Cannot Control the Legs Syndrome')
t2 = Treatment(title='Conservative Approach', description='Have a seat.')
d2.treatments.append(t2)

p1.diseases.extend([d1,d2])

for pid in patients:
    print()
    print('PID:{} {} {}'.format(pid, patients[pid]['name'],\
           patients[pid]['surname']))
    print(50*'-')
    for disease in patients[pid].diseases:
        print()
        print('Disease: {}'.format(disease['name']))
        for treatment in disease.treatments:
            print('Treatment: {}'.format(treatment['title']))
            print('\t\t{}'.format(treatment['description']))

相关问题 更多 >

    热门问题