如何更高效地通过对象变量从对象数组中选择一个项目?

0 投票
2 回答
42 浏览
提问于 2025-04-14 15:47

我有一个叫“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)

这样做可以把你的病人信息保存在一个字典里,利用哈希表来快速查找和引用。

撰写回答