向Python字典追加元素时触发Attribute Error的问题排查
排查AttributeError:向字典值追加元素失败的问题
首先看你代码里的核心问题:你用了collections.defaultdict(list)来自动生成值为列表的字典,但在处理州名的时候,错误地把列表覆盖成了整数0:
dict[State] = dict.get(State,0)
这行代码完全多余——defaultdict(list)的特性就是当访问不存在的键时,自动创建一个空列表作为值。而你这行把原本应该是列表的值改成了0(整数类型),后面再执行dict[State].append(RegionName)时,自然会触发AttributeError,因为整数没有append()方法。
另外还有两个潜在问题需要修正:
State变量没有初始化,如果文件第一行不是州名,会直接触发NameError- 重复读取文件:先用pandas读了
unit,后面又用open读hand,完全没必要
修正后的代码
import re from collections import defaultdict # 初始化默认字典,值为列表 college_towns = defaultdict(list) current_state = None # 初始化当前州变量,避免未定义错误 with open('university_towns.txt', 'r') as hand: for line in hand: line = line.strip() # 先去除首尾空白字符,处理更干净 # 匹配州名行(格式:州名[edit]) state_match = re.match(r'(.+)\[edit\]', line) if state_match: current_state = state_match.group(1).strip() # 这里不需要手动赋值,defaultdict会自动创建空列表 continue # 处理大学城行(格式:城镇名(大学名)...) if current_state is not None: # 确保已经找到过州名 # 提取城镇名,直到第一个'('为止 region_name = line.split('(')[0].strip() college_towns[current_state].append(region_name) # 打印结果示例 for state, towns in list(college_towns.items())[:3]: print(f"{state}: {towns}")
关键改进点
- 移除错误的赋值语句:删掉
dict[State] = dict.get(State,0),让defaultdict自动管理列表的创建 - 初始化
current_state:避免未定义变量的错误,确保只有在找到州名后才处理大学城 - 更可靠的州名匹配:用
re.match直接提取州名,比split更精准 - 使用
with语句:自动管理文件句柄,避免资源泄漏 - 变量名更清晰:把
dict改成college_towns,避免和内置类型dict重名(虽然Python允许,但不推荐)
这样修改后,就能正确生成你期望的格式:{'Alabama': ['Auburn', 'Florence', ...], 'Alaska': ['Fairbanks'], ...}
内容的提问来源于stack exchange,提问作者Tschau Sepp
相关产品推荐
相关产品推荐

