Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何有效地迭代字典的值?_Python_Pandas_Dictionary - Fatal编程技术网

Python 如何有效地迭代字典的值?

Python 如何有效地迭代字典的值?,python,pandas,dictionary,Python,Pandas,Dictionary,我正在使用字典运行学校作业匹配算法。算法的所有过程都相对高效,除了需要将结果导出到.csv的部分 students是一本包含483.070对键值的字典。键是一个带id的整数,值是我创建的学生类对象。实际上,要导出结果,我使用以下方法 def解析学生匹配信息(学生:学生)->int: 如果student.assigned_空缺为无: 返回0 返回student.assigned\u缺额.program\u id def get_分配_输出(学生:dict)->pd.DataFrame: 结果=pd

我正在使用字典运行学校作业匹配算法。算法的所有过程都相对高效,除了需要将结果导出到
.csv
的部分

students
是一本包含483.070对键值的字典。键是一个带id的整数,值是我创建的学生类对象。实际上,要导出结果,我使用以下方法

def解析学生匹配信息(学生:学生)->int:
如果student.assigned_空缺为无:
返回0
返回student.assigned\u缺额.program\u id
def get_分配_输出(学生:dict)->pd.DataFrame:
结果=pd.DataFrame(列=['Student\u ID'、'Program\u ID'、'Grade\u ID'])
学生价值观():
程序id=解析学生匹配信息(学生)
result=result.append({'Student\u ID':Student.ID,'Program\u ID':Program\u ID,'Grade\u ID':Student.Grade},忽略\u index=True)
返回结果。对值进行排序('Grade\U ID')

制作这个
pd.DataFrame
花了一个多小时。欢迎任何建议

通常,您不希望附加到数据帧,而是从一个iterable创建它,更好的方法如下所示

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

通过这种方式,您可以一次从所有行创建数据帧,然后在最后对其进行排序,而不是每次迭代。您应该从中看到性能方面的改进。

代码的每个部分花费了多少时间?在学生的迭代中,学生的解析、数据帧的附加和排序。确定哪一个花费的时间最长。如果您正在寻找改进工作代码的建议,那么这可能属于您。只是出于好奇,这将时间减少到了什么?从1小时减少到15-20秒!