嵌套字典赋值异常:修改指定条目却同步所有日期对应值
问题根源与解决办法
你遇到的问题核心是字典引用传递的坑:你定义的contribution_dict是一个单独的字典对象,在循环给data_dict赋值时,所有日期键指向的都是同一个字典的引用,不是各自独立的副本。所以你修改其中一个日期下的键值,所有日期对应的字典都会跟着变——因为它们本质上是同一个东西。
解决步骤
把循环中赋值的代码改成每次创建contribution_dict的副本,而不是直接用原字典。有几种简单的方式:
- 使用字典的
copy()方法:
for all_values in range(len(list)): data_dict[str(list[all_values])] = contribution_dict.copy()
- 用
dict()构造函数创建副本:
for all_values in range(len(list)): data_dict[str(list[all_values])] = dict(contribution_dict)
- 直接在循环里重新定义字典(适合结构简单的情况):
for all_values in range(len(list)): data_dict[str(list[all_values])] = { "INDIVIDUAL":0, 'ORGANIZATION':0, 'POLITICAL ACTION COMMITTEE':0, 'CANDIDATE':0, 'OTHER COMMITTEE':0, 'CAMPAIGN COMMITTEE':0 }
额外优化建议
你手动处理日期列表的代码可以用pandas简化,不用写循环:
# 直接把日期列转成datetime类型,提取日期部分去重排序 data_set['contribution_receipt_date'] = pandas.to_datetime(data_set['contribution_receipt_date']).dt.date unique_dates = sorted(data_set['contribution_receipt_date'].unique()) # 构建data_dict data_dict = {str(date): contribution_dict.copy() for date in unique_dates}
这样代码更简洁,也避免手动处理日期可能出现的错误。修改后再执行data_dict['2022-03-07']['POLITICAL ACTION COMMITTEE'] += 1,就只会修改对应日期下的值了。
内容的提问来源于stack exchange,提问作者Amaranth_Gray
相关产品推荐
相关产品推荐

