为了账号安全,请及时绑定邮箱和手机立即绑定

如何以有效的方式迭代字典的值?

如何以有效的方式迭代字典的值?

万千封印 2022-11-09 17:11:20
我正在使用字典运行学校作业匹配算法。该算法的所有过程都相对高效,除了我需要将结果导出到.csv.students是一个包含 483.070 对键值对的字典。键是一个带有 id 的整数,值是我创建的 Student 类对象。实际上,要导出结果,我正在使用以下方法。def parse_student_match_information(student: Student) -> int:    if student.assigned_vacancy is None:        return 0    return student.assigned_vacancy.program_iddef get_assignation_output(students: dict)-> pd.DataFrame:    result = pd.DataFrame(columns = ['Student_ID', 'Program_ID', 'Grade_ID'])    for student in students.values():        program_id = parse_student_match_information(student)        result = result.append({'Student_ID': student.id, 'Program_ID': program_id, 'Grade_ID': student.grade}, ignore_index = True)    return result.sort_values('Grade_ID')制作这个花了一个多小时pd.DataFrame。欢迎任何建议!
查看完整描述

1 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

通常,您不想附加到 DataFrame 而是从可迭代对象中创建它,更好的方法如下所示。


def parse_student_match_information(student: Student) -> int:

    if student.assigned_vacancy is None:

        return 0

    return student.assigned_vacancy.program_id


def get_assignation_output(students: dict) -> Iterable[dict]:

    for student in students.values():

        program_id = parse_student_match_information(student)

        result = {'Student_ID': student.id, 'Program_ID': program_id, 'Grade_ID': student.grade}

        yield result


def make_df(rows: Iterable[dict]) -> pd.DataFrame:

    df = pd.DataFrame(rows, columns=['Student_ID', 'Program_ID', 'Grade_ID'])

    df.sort_values(by=['Grade_ID'])

    return df

这样,您可以一次从所有行创建 DataFrame,然后在最后对它进行一次排序,而不是每次迭代。您应该会从中看到性能方面的改进。


查看完整回答
反对 回复 2022-11-09
  • 1 回答
  • 0 关注
  • 81 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信