Python生成嵌套字典时所有键对应值全部相同的原因是什么
问题原因排查
核心问题是Python可变对象的引用复用冲突,具体问题点:
- 你将内层计数字典
valdic的初始化放在了headers的遍历循环中,处理同一个分类字段下的所有属性值时,全程复用同一个valdic字典对象 - 字典属于Python可变对象,后续修改
valdic的键值时,之前已经存入attdic的所有valdic引用都会同步更新,最终所有属性值对应的内层字典都会被覆盖为最后一个属性值的统计结果 - 额外问题:原代码把
attdic、di的赋值逻辑放在了最内层循环中,存在大量无意义的重复写入操作
修正方案
把valdic的初始化逻辑移动到属性值遍历循环内部,每次处理一个属性值时新建独立的计数字典即可:
from collections import OrderedDict def frequency(df, headers, numerical, target): di = {} if len(numerical) == 0: print("No NM") else: for i in numerical: if i in headers: headers.remove(i) for i in range(len(headers)): attdic = {} aux_list = df[headers[i]].to_list() aux_list = list(OrderedDict.fromkeys(aux_list)) tar_list = df[target].to_list() tar_list = list(OrderedDict.fromkeys(tar_list)) for j in range(len(aux_list)): valdic = {} # 改到这里,每个属性值对应独立的计数字典 for k in range(len(tar_list)): temp_df = df.loc[(df[headers[i]] == aux_list[j]) & (df[target] == tar_list[k])] tempvar = len(temp_df.index) + 1 valdic[tar_list[k]] = tempvar attdic[aux_list[j]] = valdic # 内层计数完成后再赋值 di[headers[i]] = attdic # 所有属性值处理完再赋值给外层字典 return di
内容的提问来源于stack exchange,提问作者SergioPD08
相关产品推荐
相关产品推荐

