Python:将嵌套字典CAN1的值替换至CAN0指定位置
问题:批量将CAN1字典中的信号值更新到CAN0
原始数据结构
首先需要修正原始代码的语法错误(信号值需用列表[]包裹,键值对末尾添加逗号),正确结构如下:
CAN0 = { "signal11": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "signal12": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "signal21": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "signal22": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "signal31": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], "signal32": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] } CAN1 = { "message1": { "signal11": [32,41,53,62,77], "signal12": [54,67,24,33,78] }, "message2": { "signal21": [55,53,63,62,77], "signal22": [34,65,94,97,24] }, "message3": { "signal31": [13,14,53,42,63], "signal32": [34,56,26,97,84] } }
期望更新后的CAN0结构
CAN0 = { "signal11": [0,0,0,32,41,53,62,77,0,0,0,0,0,0,0,0,0], "signal12": [0,0,0,54,67,24,33,78,0,0,0,0,0,0,0,0,0], "signal21": [0,0,0,55,53,63,62,77,0,0,0,0,0,0,0,0,0], "signal22": [0,0,0,34,65,94,97,24,0,0,0,0,0,0,0,0,0], "signal31": [0,0,0,13,14,53,42,63,0,0,0,0,0,0,0,0,0], "signal32": [0,0,0,34,56,26,97,84,0,0,0,0,0,0,0,0,0] }
错误尝试及报错
尝试以下代码时触发报错:'int' object is not subscriptable
for message in CAN1: for signal in CAN1[message] for i in range (3,7) CAN0[str(signal)][i] = CAN1[message][signal][i]
问题根源
- 语法错误:原始字典中信号值未用列表包裹,Python会将逗号分隔的数字解析为多个参数,导致字典值实际为单个整数(甚至触发语法报错),无法通过下标访问。
- 索引不匹配:
range(3,7)仅覆盖4个位置,但CAN1中每个信号有5个值,无法完全对应目标位置。 - 循环语法缺失:for循环末尾未添加冒号
:,属于基础语法错误。
解决方案代码
# 遍历CAN1中所有消息的内容 for message_content in CAN1.values(): # 遍历当前消息内的所有信号键值对 for signal_name, signal_values in message_content.items(): # 从CAN0的索引3开始,逐个替换为CAN1的信号值 for idx, val in enumerate(signal_values): CAN0[signal_name][3 + idx] = val
代码说明
- 先修正原始字典的语法,将信号值改为列表类型,确保可以通过下标修改元素。
- 使用
CAN1.values()直接获取消息内容,简化遍历逻辑。 - 借助
enumerate同时获取CAN1信号值的索引和数值,精准对应CAN0中从索引3开始的5个位置,保证批量更新的准确性。 - 补全循环所需的冒号,避免语法错误。
内容的提问来源于stack exchange,提问作者lost_coder
相关产品推荐
相关产品推荐

