Python字典用d[key]取值时,键不存在会抛出KeyError,这是频次统计、配置读取和嵌套字典访问中常见的出错点。dict.get()的价值是容错取值:键存在返回对应值,键不存在返回指定默认值,不修改字典,也不自动创建键。基本形式为dict.get(key, default=None),key是待查找键,default可选。
一、get与直接下标的区别
- d = {'name': 'Tom', 'age': 18}
- print(d['name']) # Tom
- # print(d['gender']) # KeyError: 'gender'
- print(d.get('name')) # Tom
- print(d.get('gender')) # None
- print(d.get('gender', '未知')) # 未知
复制代码
直接下标要求键必须存在;get在键缺失时返回默认值。因此,配置读取可写成config.get('port', 8080),替代先判断if 'name' in d再取值的写法。
二、用get做频次统计
计数场景的核心是count[w] = count.get(w, 0) + 1:先取当前键的计数,缺失时按0处理,再加1写回。示例:
- words = ['a', 'b', 'a', 'c', 'a']
- count = {}
- for w in words:
- count[w] = count.get(w, 0) + 1
- print(count) # {'a': 3, 'b': 1, 'c': 1}
复制代码
分组场景可以用setdefault(k, []).append(v),原文也提到可配合get。嵌套字典链式访问时,用user.get('info', {}).get('name', '未知')可避免中间层缺失导致异常。
三、实用案例:统计上榜大学的国家与数量
原文案例读取data.txt,每行格式为排名、学校名称、国家,字段用逗号分隔;程序跳过字段不足3个的行,以国家为键,把学校名称收集到列表中,再按国家上榜大学数量降序输出。关键语句dic[i[-1]] = dic.get(i[-1], []) + [i[1]]的含义是:以i[-1]国家为键,取出已有学校列表,不存在时用空列表,再拼接当前学校i[1]并写回字典。完整代码:
- f = open('data.txt', 'r', encoding='utf-8')
- dic = {}
- for line in f:
- i = line.strip().split(',')
- if len(i) < 3:
- continue
- dic[i[-1]] = dic.get(i[-1], []) + [i[1]]
- unis = list(dic.items())
- unis.sort(key=lambda x: len(x[1]), reverse=True)
- for d in unis:
- print('{:>4}: {:>4} : {}'.format(d[0], len(d[1]), ','.join(d[1])))
复制代码
这段代码中,i[-1]取国家字段,i[1]取学校名称,len(i) < 3用于过滤不完整记录;list(dic.items())把字典转为可排序的列表,sort的key=lambda x: len(x[1])按学校列表长度排序,reverse=True表示降序;输出时len(d[1])是国家上榜学校数,','.join(d[1])把学校名称用逗号连接。若数据量较大,这种每次拼接新列表的写法逻辑直观,但会频繁创建列表,实际项目可关注开销。
四、注意事项
get()不会修改字典,键不存在时也不会自动添加:d = {}时d.get('x', 10)返回10,但d仍为{}。需要不存在则添加时用setdefault,例如d.setdefault('x', 10)后d变为{'x': 10}。默认值只在键缺失时返回;如果键存在但值为None,d.get('x', 100)返回None而不是100。列表、集合等对象没有字典的get方法,列表的index语义也不同。requests的GET请求、Queue的get()、Tkinter变量的get()等属于不同类的同名方法,语义各异,不要与字典get混用。
五、选择建议
确定键存在时可直接用d[key];键可能不存在时用d.get(key, default);需要不存在则添加时用d.setdefault(key, default)。get()的本质是容错取值,适合配置读取、计数、分组和嵌套字典安全访问等场景。 |