Python及pandas中删除值为null的字典键遇迭代报错如何解决
解决方案
报错原因
- 第一次触发
RuntimeError: dictionary changed size during iteration:因为你在迭代字典本身的键视图过程中删除了字典的键,Python禁止在遍历字典原生元素的同时修改字典大小。 - 第二次触发
AttributeError: 'list' object has no attribute 'items':你的dicties是存储多个字典的列表,只有字典对象支持items()方法,列表没有该方法,直接调用必然报错。
纯Python实现方案
你可以预先定义需要处理的指定键列表,迭代这个固定的外部列表来操作字典,完全避开迭代字典本身的问题,示例代码如下:
# 待处理的字典列表示例 dicties = [ {'number1': '123', 'number2': None, 'other': 'test'}, {'number1': None, 'number2': '456', 'other': 'abc'} ] # 定义需要处理的指定键 process_keys = ['number1', 'number2'] for d in dicties: for key in process_keys: # 先判断键是否存在,避免抛出KeyError if key not in d: continue current_val = d[key] if current_val is None: # 值为null直接删除键 del d[key] else: # 非null转成int类型 d[key] = int(current_val)
pandas实现方案
如果你已经在使用pandas,也可以通过DataFrame批量处理后再转回字典列表,代码更简洁:
import pandas as pd dicties = [ {'number1': '123', 'number2': None, 'other': 'test'}, {'number1': None, 'number2': '456', 'other': 'abc'} ] process_keys = ['number1', 'number2'] # 字典列表转DataFrame df = pd.DataFrame(dicties) # 指定列转数值类型,非法值和空值转NaN df[process_keys] = df[process_keys].apply(pd.to_numeric, errors='coerce') # 转成字典列表 result = df.to_dict('records') # 删除每个字典中值为NaN的指定键 for d in result: for key in process_keys: if pd.isna(d.get(key)): del d[key]
内容的提问来源于stack exchange,提问作者wow
相关产品推荐
相关产品推荐

