如何在python 3.7中修复“运行时错误:字典在迭代过程中更改了大小”

时间:2019-07-14 14:39:49

标签: python python-3.x dictionary runtime-error

if __name__ == '__main__':

    students = {}

    for _ in range(int(input())):
        name = input()
        score = float(input())
        seq = {name: score}
        students.update(seq)
        a = min(students, key=students.get)

    for key, value in students.items():
        while a == min(students, key=students.get):
            del students[min(students, key=students.get)]

    print(students)

在上面的代码中,我想删除字典中的最小值元素。

我能够从字典中删除单个最小元素。但是,如果字典中有多个相同的最低价值元素,我想删除所有这些最低价值元素。

2 个答案:

答案 0 :(得分:0)

您可以在min上使用students.values()来获取最小值,

然后收集所有具有相同值的键,

然后对所有这些键使用del,如下所示:

if __name__ == '__main__':

    students = {}

    for _ in range(int(input())):
        name = input()
        score = float(input())
        seq = {name: score}
        students.update(seq)

    min_val = min(students.values())
    all_keys_with_min_val = [key for key, value in students.items() if value == min_val]

    for key in all_keys_with_min_val:
        del students[key]

    print(students)

答案 1 :(得分:0)

最可靠的方法不是删除条目,而是创建没有条目的新dict。使用dict理解来过滤出所有得分最低的条目:

if __name__ == '__main__':
    students = {}
    for _ in range(int(input())):
        name = input()
        score = float(input())
        students[name] = score  # store directly without update
    min_score = min(students.values())  # calculate minimum only once

    students = {
        name: score for name, score in students.items()
        if score != min_score  # only keep students above minimum score
    }
    print(students)

如果您要修改初始的dict,请创建一个单独的条目列表以进行迭代:

...
min_score = min(students.values())  # calculate minimum only once

min_score_students = [name for name, score in students.items() if score == min_score]
for student in min_score_students:
    del students[key]
print(students)