遍历列表构建字典时,为何夜间时段对应的列表仅保留单个值?
问题原因
你遇到的问题是字典键的重复赋值覆盖:
当处理夜间时段的多个条目时,它们对应的字典键都是'2022-10-16 00:00:00',但你每次都直接用my_dict[key] = [value[i]]给这个键赋值新的单元素列表,这会把之前存储的列表完全替换掉,最终只保留最后一次赋值的[900.0]。
修正方案
方案1:手动检查键是否存在
修改循环内的逻辑,先判断键是否已在字典中:
import datetime as dt dates = ['2022-10-16 17:00:00', '2022-10-16 18:00:00', '2022-10-16 21:00:00', '2022-10-16 22:00:00'] values = [1920.0, 570.0, 1680.0, 900.0] def to_dict(): my_dict = {} for i in range(len(dates)): date_str = dates[i] value = values[i] hour = dt.datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S").hour if 6 < hour <= 17: key = date_str[:11] + "06:00:00" if key in my_dict: my_dict[key].append(value) else: my_dict[key] = [value] else: key = date_str[:11] + "00:00:00" if key in my_dict: my_dict[key].append(value) else: my_dict[key] = [value] print(my_dict) return my_dict to_dict()
方案2:使用collections.defaultdict简化逻辑
用defaultdict自动初始化列表类型的键值,省去手动检查的步骤:
import datetime as dt from collections import defaultdict dates = ['2022-10-16 17:00:00', '2022-10-16 18:00:00', '2022-10-16 21:00:00', '2022-10-16 22:00:00'] values = [1920.0, 570.0, 1680.0, 900.0] def to_dict(): my_dict = defaultdict(list) for date_str, value in zip(dates, values): hour = dt.datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S").hour if 6 < hour <= 17: key = date_str[:11] + "06:00:00" else: key = date_str[:11] + "00:00:00" my_dict[key].append(value) # 可选:转换为普通字典 print(dict(my_dict)) return dict(my_dict) to_dict()
两种方案运行后都会得到你期望的结果:
{'2022-10-16 06:00:00': [1920.0], '2022-10-16 00:00:00': [570.0, 1680.0, 900.0]}
内容的提问来源于stack exchange,提问作者ilra
相关产品推荐
相关产品推荐

