如何解决Python用literal_eval给字典列表新增键值对不生效的问题
错误原因
你原代码的核心问题是:ast.literal_eval() 每次调用都会生成一个独立的临时字典列表对象,你仅修改了这个临时对象的属性,没有将修改后的结果回写到DataFrame的对应位置,因此改动不会被持久化保存。
解决方案
方案1:统一所有元素的type值(全为1)
推荐使用pandas的apply方法实现,代码更简洁高效:
import ast df['col1'] = df['col1'].apply( lambda s: [dict(item, type=1) for item in ast.literal_eval(s)] )
如果习惯用for循环写法,可参考下方实现,核心是要把修改后的数据回写:
import ast for i in range(len(df)): # 先将字符串转为字典列表存入变量 dict_list = ast.literal_eval(df.loc[i, 'col1']) # 遍历新增字段 for item in dict_list: item['type'] = 1 # 回写修改后的结果到原列 df.loc[i, 'col1'] = dict_list
方案2:根据key值匹配不同type
如果需要给不同key的字典分配不同type值,可以提前定义映射表实现:
import ast # 自定义key和type的对应关系 type_mapping = { 'cat': 1, 'dog': 1, 'flower': 2, 'house': 3 # 其余key的映射按需补充 } df['col1'] = df['col1'].apply( lambda s: [dict(item, type=type_mapping.get(item['key'], 0)) for item in ast.literal_eval(s)] )
其中type_mapping.get(item['key'], 0)的0为默认值,可自行调整为无匹配时需要赋值的type值。
鲁棒性优化
如果列中存在空值、格式不合法的字符串,可增加异常判断避免报错:
import ast def process_col_str(s): try: dict_list = ast.literal_eval(s) return [dict(item, type=1) for item in dict_list] except: # 格式异常时返回原内容或空列表,按需调整 return s df['col1'] = df['col1'].apply(process_col_str)
内容的提问来源于stack exchange,提问作者bonbon
相关产品推荐
相关产品推荐

