如何用Pythonic方式向列表字典中添加新键?
更简洁的Pythonic实现方案
针对你这种动态构建“键对应列表”字典的场景,有几种更简洁且符合Python风格的写法,同时还能保持代码可读性:
1. 使用collections.defaultdict(最推荐)
defaultdict是Python标准库专为这类场景设计的工具,它会自动为不存在的键创建指定类型的默认值(这里是列表),省去手动判断键是否存在的步骤:
from collections import defaultdict import re import os nums = defaultdict(list) allpngs = [ii for ii in os.listdir() if ii.endswith('.png')] # 用endswith比in更严谨 for png in allpngs: regex = r'(.*)(\d{4,})\.png' match = re.search(regex, png) if match: # 增加匹配失败的容错,避免报错 prefix = match.group(1) mynum = int(match.group(2)) nums[prefix].append(mynum)
优化点:
- 用
defaultdict(list)替代普通字典,直接调用append无需判断键是否存在 - 把
re.search的结果存为变量match,避免重复执行正则匹配 - 用
ii.endswith('.png')替代'.png' in ii,避免匹配到像test.png.txt这类不符合要求的文件 - 增加
if match:的判断,防止文件名不匹配正则时报错
2. 使用字典内置的setdefault方法(无需导入模块)
如果不想导入额外模块,dict.setdefault可以在一行内完成“键不存在则初始化列表”的操作:
import re import os nums = {} allpngs = [ii for ii in os.listdir() if ii.endswith('.png')] for png in allpngs: regex = r'(.*)(\d{4,})\.png' match = re.search(regex, png) if match: prefix = match.group(1) mynum = int(match.group(2)) nums.setdefault(prefix, []).append(mynum)
优化点:
- 用
nums.setdefault(prefix, [])替代原来的if-else判断:如果prefix不存在,就创建一个空列表作为值,然后直接append - 同样优化了正则匹配的重复调用和文件后缀判断
3. 结合海象运算符(Python 3.8+)进一步简化
如果你的Python版本在3.8及以上,可以用海象运算符:=把正则匹配的判断和赋值合并,减少代码行数:
from collections import defaultdict import re import os nums = defaultdict(list) allpngs = [ii for ii in os.listdir() if ii.endswith('.png')] for png in allpngs: if match := re.search(r'(.*)(\d{4,})\.png', png): nums[match.group(1)].append(int(match.group(2)))
这个写法把变量赋值和条件判断合并,同时去掉了中间变量prefix和mynum,代码更紧凑但依然保持可读性。
内容的提问来源于stack exchange,提问作者EllipticalInitial
相关产品推荐
相关产品推荐

