You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:20:35