You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

我知道编辑副本可避免错误,但不知道嵌套字典里该怎么操作,恳请帮助!


解决方案

错误原因分析

你遇到的错误核心有两个:

  1. 内层循环遍历的是value.values()(即时间字符串),执行value[k] = open_hour_range时,是给字典新增了一个以时间字符串为键的条目,导致遍历过程中字典大小变化,触发RuntimeError。
  2. 逻辑错误:你需要修改的是原有的星期几(如'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:25:16