我的问题类似于this one几年前发布的,但我还有一件事我不知道该怎么做。假设我有两个列表,每个列表包含一组对象。这些对象共享一个共同属性:
class Student:
def __init__(self, value) -> None:
self.value = value
class School:
def __init__(self, value) -> None:
self.value = value
self.students = []
Student_List = [Student(1), Student(1), Student(3), Student(3), Student(5)]
School_List = [School(5), School(2), School(1), School(3), School(4)]
我的目标是搜索具有匹配值的对象,然后对列表中保存的对象执行操作。我目前的方法如下:
for student in Student_List:
for school in School_List:
if student.value == school.value:
school.students.append(student)
break
这显然效率很低,找到路口会容易得多。但是,请注意我是如何通过将 Student 对象附加到 School 的列表来更改 School 的属性的。
最佳答案
您可以创建一个反向映射,将每个学校值映射到相应的学校对象,这样您就可以遍历学生列表,并通过值映射高效地获取匹配的学校对象,将学生对象附加到:
schools = {school.value: school for school in School_List}
for student in Student_List:
schools[student.value].students.append(student)
通过这种方法,您可以将时间复杂度从 O(n ^ 2) 降低到 O(n)。
关于python - 根据公共(public)属性对两个对象列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74049384/