如何使generic_curves_dict各键对应generic_CT_curves_month的对应日期?
问题解决:字典所有键对应同个日期值的修复
问题现象
尝试给generic_curves_dict的每个键(如A1、B2)添加month字段,使其对应generic_CT_curves_month列表中对应索引的日期,但运行后所有键的month值都变成了列表最后一个日期,无法实现A1对应第一个日期、B2对应第二个日期的预期效果。
错误代码:
import numpy as np generic_list = ['A1', 'B2', 'C3', 'D4', 'E5', 'F6'] empty_dict = [{}] generic_CT_curves_month = [np.datetime64('2022-12-01T00:00:00.000000000'), np.datetime64('2023-03-01T00:00:00.000000000'), np.datetime64('2023-05-01T00:00:00.000000000'), np.datetime64('2023-07-01T00:00:00.000000000'), np.datetime64('2023-10-01T00:00:00.000000000'), np.datetime64('2023-12-01T00:00:00.000000000')] generic_curves_dict = dict(zip(generic_list, empty_dict * 6)) print(generic_curves_dict) for ticker in generic_curves_dict: generic_curves_dict[str(ticker)]['month'] = generic_CT_curves_month[int(ticker[-1])-1] generic_curves_dict
错误输出:
{'A1': {'month': numpy.datetime64('2023-12-01T00:00:00.000000000')}, 'B2': {'month': numpy.datetime64('2023-12-01T00:00:00.000000000')}, 'C3': {'month': numpy.datetime64('2023-12-01T00:00:00.000000000')}, 'D4': {'month': numpy.datetime64('2023-12-01T00:00:00.000000000')}, 'E5': {'month': numpy.datetime64('2023-12-01T00:00:00.000000000')}, 'F6': {'month': numpy.datetime64('2023-12-01T00:00:00.000000000')}}
错误原因
问题出在empty_dict * 6这行:empty_dict是包含单个空字典的列表,当用*6复制时,列表里的6个元素都是同一个字典对象的引用。也就是说,generic_curves_dict里所有键指向的都是同一个字典,循环中每次修改'month'字段,都是在修改这个共享的字典,最后一次修改的值会覆盖之前所有操作,导致所有键的month都是最后一个日期。
修复方案
方案1:创建独立的空字典
把empty_dict *6替换成列表推导式[{} for _ in range(6)],这样每个元素都是全新的空字典,互相独立。
修复后代码:
import numpy as np generic_list = ['A1', 'B2', 'C3', 'D4', 'E5', 'F6'] generic_CT_curves_month = [np.datetime64('2022-12-01T00:00:00.000000000'), np.datetime64('2023-03-01T00:00:00.000000000'), np.datetime64('2023-05-01T00:00:00.000000000'), np.datetime64('2023-07-01T00:00:00.000000000'), np.datetime64('2023-10-01T00:00:00.000000000'), np.datetime64('2023-12-01T00:00:00.000000000')] # 用列表推导式生成6个独立的空字典 generic_curves_dict = dict(zip(generic_list, [{} for _ in range(6)])) for ticker in generic_curves_dict: generic_curves_dict[ticker]['month'] = generic_CT_curves_month[int(ticker[-1])-1] print(generic_curves_dict)
方案2:构建字典时直接关联日期(更高效)
不需要先创建空字典再循环赋值,直接在构建字典的时候就把对应的month字段加上,一步到位:
import numpy as np generic_list = ['A1', 'B2', 'C3', 'D4', 'E5', 'F6'] generic_CT_curves_month = [np.datetime64('2022-12-01T00:00:00.000000000'), np.datetime64('2023-03-01T00:00:00.000000000'), np.datetime64('2023-05-01T00:00:00.000000000'), np.datetime64('2023-07-01T00:00:00.000000000'), np.datetime64('2023-10-01T00:00:00.000000000'), np.datetime64('2023-12-01T00:00:00.000000000')] # 直接通过zip配对键和日期,生成带month字段的字典 generic_curves_dict = { ticker: {'month': date} for ticker, date in zip(generic_list, generic_CT_curves_month) } print(generic_curves_dict)
正确输出
{'A1': {'month': numpy.datetime64('2022-12-01T00:00:00.000000000')}, 'B2': {'month': numpy.datetime64('2023-03-01T00:00:00.000000000')}, 'C3': {'month': numpy.datetime64('2023-05-01T00:00:00.000000000')}, 'D4': {'month': numpy.datetime64('2023-07-01T00:00:00.000000000')}, 'E5': {'month': numpy.datetime64('2023-10-01T00:00:00.000000000')}, 'F6': {'month': numpy.datetime64('2023-12-01T00:00:00.000000000')}}
内容的提问来源于stack exchange,提问作者Haikal Yeo
相关产品推荐
相关产品推荐

