如何更高效地通过对象变量从对象数组中选择一个项目?
我有一个叫“patient”的类:
class patient:
all_patients = []
def __init__(self, pat_id):
self.pat_id=pat_id
self.plans=[]
patient.all_patients.append(self)
我需要处理一个日志文件,这个文件里记录了所有病人的治疗计划,我想把每个治疗计划添加到对应的病人里。
我的做法是这样的:(index是日志文件的当前行)
if not any (x.pat_id == index[4] for x in patients):
patients.append(patient(index[4]))
for pat in patient.all_patients:
if (pat.pat_id == index[4]):
if (index[11] not in pat.plans):
total_plans+=1
pat.plans.append(index[11])
print(len(patient.all_patients))
print(total_plans)
我觉得它返回的数字是对的,但我觉得这样做效率不是很高。因为日志文件很大,而且每个治疗计划在日志文件中出现了好几次(每次预约一次)。
你能帮我优化一下这个代码吗?
2 个回答
1
看起来你想要在 patients
列表中不出现重复的内容。为了实现这个功能,你可以使用 map
或者 set
,这样可以让查找的时间变得非常快,这样会大大提升你代码的性能。
你可以为每个病人实现一个 __hash__
函数,然后用这个函数和 set
数据结构来处理,而不是依赖 id
作为主要的标识。
1
根据另一个回答的建议:点击这里查看链接描述.
我会把你的代码改写成这样:
class Patient:
def __init__(self, pat_id: int):
self.pat_id : int = pat_id
self.plans: list = []
patients: dict = {}
total_plans: int = 0
patient_id, patient_plan = index[4], index[11]
if not patient_id in patients:
patients.update({patient_id:Patient(patient_id)})
else:
if patient_plan not in patients[patient_id].plans:
total_plans += 1
patients[patient_id].plans.append(patient_plan)
print(len(patients))
print(total_plans)
这样做可以把你的病人信息保存在一个字典里,利用哈希表来快速查找和引用。