如何用Python列表新值批量更新字典列表指定键的值?
字典列表按序更新指定键值的解决方案
需求说明
遍历字典列表,将每个字典中指定键的值替换为有序列表对应位置的新值——第1个字典的指定键对应新值列表第1个元素,以此类推。
示例数据:
dict_list = [{'person':'Tom', 'job':'student'}, {'person':'John', 'job':'teacher'}, {'person':'Mary', 'job':'manager'}] new_jobs = ['lecturer', 'cook', 'driver']
期望结果:
dict_list = [{'person':'Tom', 'job':'lecturer'}, {'person':'John', 'job':'cook'}, {'person':'Mary', 'job':'driver'}]
错误代码分析
你尝试的嵌套循环逻辑存在问题:
def update_dic_list(): for dictionary in dict_list: for i in range(len(new_jobs)): dictionary['job'] = new_jobs[i] print(dict_list)
内层循环会遍历所有新值,最终每个字典的job都会被覆盖为new_jobs的最后一个元素(driver),外层循环每处理一个字典就打印一次,因此会看到字典逐步被替换为最后一个新值的过程。
正确解决方案
方法1:使用zip()配对遍历
利用zip()将字典列表和新值列表的对应元素配对,一次循环即可完成更新:
dict_list = [{'person':'Tom', 'job':'student'}, {'person':'John', 'job':'teacher'}, {'person':'Mary', 'job':'manager'}] new_jobs = ['lecturer', 'cook', 'driver'] # 遍历配对后的字典和新值 for dic, new_job in zip(dict_list, new_jobs): dic['job'] = new_job print(dict_list)
方法2:封装为通用函数
如果需要频繁处理这类需求,可以封装成通用函数,支持指定任意键:
def update_dict_list(dict_list, target_key, new_values): # 配对遍历字典列表和新值列表 for dic, value in zip(dict_list, new_values): dic[target_key] = value # 调用示例 dict_list = [{'person':'Tom', 'job':'student'}, {'person':'John', 'job':'teacher'}, {'person':'Mary', 'job':'manager'}] new_jobs = ['lecturer', 'cook', 'driver'] update_dict_list(dict_list, 'job', new_jobs) print(dict_list)
方法3:处理长度不一致的情况
如果字典列表和新值列表长度不同,zip()会以较短的列表为准。若需要明确处理索引(避免越界),可以用索引遍历:
def update_dict_list(dict_list, target_key, new_values): # 取两者的最小长度,只处理存在对应元素的位置 max_index = min(len(dict_list), len(new_values)) for i in range(max_index): dict_list[i][target_key] = new_values[i]
内容的提问来源于stack exchange,提问作者Tomáš Savčenko
相关产品推荐
相关产品推荐

