如何实现两个字典列表中对应字典的键值相乘?
解决两个字典列表对应位置键值相乘的问题
需求说明
给定两个字典列表:
- list1内所有字典的键完全相同
- list2内所有字典的键也完全相同
- 两个列表长度始终一致,需按索引对应位置的字典值相乘,生成包含统一键
product的字典列表,最终用于Flask的Jinja模板循环填充表格。
输入示例
list1 = [{'l1_key': 1}, {'l1_key': 2}] list2 = [{'l2_key': 28.64}, {'l2_key': 303.35}]
期望输出
multiplied = [{'product': 28.64}, {'product': 606.7}]
现有问题分析
你写的嵌套循环逻辑错误,且操作字典的方式导致了KeyError:
- 嵌套循环会让list1的每个元素和list2的所有元素相乘,不符合"对应位置"的要求
- 每次循环后清空
values字典,下一次循环访问values['value1']时会找不到键
错误代码
list1 = [{'l1_key': 1}, {'l1_key': 2}] list2 = [{'l2_key': 28.64}, {'l2_key': 303.35}] values = {} multiplied = [] # 遍历list1[] for i in range(len(list1)): # 更新values{} values.update({"value1": list1[i]['l1_key']}) print('values: ', values) # 遍历list2[] for x in range(len(list2)): # 更新values{} values.update({"value2": list2[x]['l2_key']}) print('product: ', multiplied) # 赋值给变量 num1 = values['value1'] num2 = values['value2'] # 相乘后添加到multiplied[] multiplied.append({"product": num1 * num2}) print('multiplied: ', multiplied) # 清空values{}用于下一次循环 values.clear()
终端错误输出
TERMINAL OUTPUT ---------------- values: {'value1': 1} values: {'value1': 1, 'value2': 28.64} multiplied: [] multiplied: [{'product': 28.64}] values: {'value2': 303.35} multiplied: [{'product': 28.64}] ... in line xxx num1 = values['value1'] KeyError: 'value1'
解决方案
方案1:修复基础循环结构
直接按索引遍历,不需要额外字典中转,逻辑更清晰:
list1 = [{'l1_key': 1}, {'l1_key': 2}] list2 = [{'l2_key': 28.64}, {'l2_key': 303.35}] multiplied = [] for i in range(len(list1)): num1 = list1[i]['l1_key'] num2 = list2[i]['l2_key'] multiplied.append({"product": num1 * num2}) print(multiplied) # 输出: [{'product': 28.64}, {'product': 606.7}]
方案2:Pythonic高效写法(推荐)
用zip()自动配对对应元素,配合列表推导式,代码更简洁且可扩展性更强:
list1 = [{'l1_key': 1}, {'l1_key': 2}] list2 = [{'l2_key': 28.64}, {'l2_key': 303.35}] # 动态获取字典的键(避免硬编码,适配后续键名变化) key1 = next(iter(list1[0].keys())) key2 = next(iter(list2[0].keys())) # 列表推导式生成结果 multiplied = [{"product": item1[key1] * item2[key2]} for item1, item2 in zip(list1, list2)] print(multiplied) # 输出: [{'product': 28.64}, {'product': 606.7}]
优势:
zip()自动配对对应位置元素,避免手动索引操作- 动态获取键名,若SQL返回的字段名改变,代码无需修改
- 列表推导式比普通循环执行效率更高
Flask Jinja模板适配
生成的multiplied列表可直接传入模板,循环填充表格:
<table> <thead> <tr><th>乘积结果</th></tr> </thead> <tbody> {% for item in multiplied %} <tr><td>{{ item.product }}</td></tr> {% endfor %} </tbody> </table>
内容的提问来源于stack exchange,提问作者ImmuneMoon
相关产品推荐
相关产品推荐

