Python嵌套字典更新时避免“字典迭代时大小改变”错误的方法
问题:嵌套字典转换时间格式触发RuntimeError
我是Python初学者,项目中用嵌套字典存储不同门店的每周营业时间,格式如下:
all_branch_hours = { 'Branch 1': { 'Sunday': '12:00-18:00', 'Monday': '09:00-18:00', 'Tuesday': '09:00-20:00', 'Wednesday': '09:00-20:00', 'Thursday': '09:00-20:00', 'Friday': '12:00-18:00', 'Saturday': '10:00-18:00' }, 'Branch 2': { 'Sunday': '13:00-17:00', 'Monday': '10:00-18:00', 'Tuesday': '10:00-20:00', 'Wednesday': '13:00-20:00', 'Thursday': '10:00-18:00', 'Friday': '13:00-18:00', 'Saturday': '10:00-18:00' }, 'Branch 3': { 'Sunday': '13:00-17:00', 'Monday': '10:00-18:00', 'Tuesday': '10:00-20:00', 'Wednesday': '10:00-20:00', 'Thursday': '10:00-20:00', 'Friday': '13:00-18:00', 'Saturday': '10:00-18:00' } }
我希望生成新字典,将时间字符串转换为整数列表(例如"12:00-18:00"转为[12,13,14,15,16,17]),方便后续判断时间是否在营业范围内。
尝试了以下代码,但出现RuntimeError: dictionary changed size during iteration错误:
import copy datetime_branch_hours = copy.deepcopy(all_branch_hours) for key, value in datetime_branch_hours.items(): for k in value.values(): openhour= int(k[0:2]) closehour= int(k[6:8]) open_hour_range = list(range(openhour, closehour)) value[k] = open_hour_range
我知道编辑副本可避免错误,但不知道嵌套字典里该怎么操作,恳请帮助!
解决方案
错误原因分析
你遇到的错误核心有两个:
- 内层循环遍历的是
value.values()(即时间字符串),执行value[k] = open_hour_range时,是给字典新增了一个以时间字符串为键的条目,导致遍历过程中字典大小变化,触发RuntimeError。 - 逻辑错误:你需要修改的是原有的星期几(如'Sunday')对应的值,而不是新增键。
方法1:修改副本的同时安全遍历
用list(hours.keys())把内层字典的键转成固定列表,避免遍历中修改字典的影响;同时用更健壮的字符串拆分方式替代硬切片:
import copy datetime_branch_hours = copy.deepcopy(all_branch_hours) for branch, hours in datetime_branch_hours.items(): # 把键转成列表,遍历固定集合 for day in list(hours.keys()): time_str = hours[day] # 拆分时间字符串,兼容不同格式的小时(如"9:00"或"09:00") open_part, close_part = time_str.split('-') openhour = int(open_part.split(':')[0]) closehour = int(close_part.split(':')[0]) # 生成营业小时范围 hours[day] = list(range(openhour, closehour))
方法2:直接创建新字典(更推荐)
不需要复制原字典,直接构建新的嵌套字典,逻辑更清晰,完全避免遍历修改的问题:
datetime_branch_hours = {} for branch, day_hours in all_branch_hours.items(): new_day_hours = {} for day, time_str in day_hours.items(): open_part, close_part = time_str.split('-') openhour = int(open_part.split(':')[0]) closehour = int(close_part.split(':')[0]) new_day_hours[day] = list(range(openhour, closehour)) datetime_branch_hours[branch] = new_day_hours
两种方法都能得到你需要的结果,比如Branch 1的'Sunday'会被转换为[12,13,14,15,16,17]。
内容的提问来源于stack exchange,提问作者Graham Galloway
相关产品推荐
相关产品推荐

