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

如何用Python字典推导式实现字典中列表的元素追加?

如何用字典推导式实现字典中列表的元素追加?

问题背景

现有列表:

files = ['AAA_1', 'BBB_2', 'CCC_1', 'AAA_2', 'BBB_4']

初始字典(注意:不要用dict作为变量名,避免覆盖Python内置类型):

initial_dict = {
     'AAA' : [],
     'BBB': [],
     'CCC' : []
}

期望得到的输出字典:

final_dict = {
     'AAA' : ['AAA_1', 'AAA_2'],
     'BBB': ['BBB_2', 'BBB_4'],
     'CCC' : ['CCC_1']
}

用普通循环可以轻松实现需求:

for file in files:
    prefix = file[:-2]
    if file.startswith(prefix):
        initial_dict[prefix].append(file)

但直接使用如下字典推导式时,每个键只会保留最后一个匹配的元素:

# 错误示例:后续键值对会覆盖前面的
bad_dict = {file[:-2]: [file] for file in files if file.startswith(file[:-2])}

得到的错误结果:

{'AAA': ['AAA_2'], 'BBB': ['BBB_4'], 'CCC': ['CCC_1']}

解决方案

字典推导式的特性是重复键会被后出现的值覆盖,所以要实现列表追加,得先完成分组逻辑,再生成字典。

方法1:结合itertools.groupby分组

利用itertools.groupby先按前缀分组,再用字典推导式生成结果:

from itertools import groupby

files = ['AAA_1', 'BBB_2', 'CCC_1', 'AAA_2', 'BBB_4']
# groupby需要连续的相同键,所以先按前缀排序
sorted_files = sorted(files, key=lambda x: x[:-2])
final_dict = {prefix: list(group) for prefix, group in groupby(sorted_files, key=lambda x: x[:-2])}

执行后得到的结果完全符合预期:

{'AAA': ['AAA_1', 'AAA_2'], 'BBB': ['BBB_2', 'BBB_4'], 'CCC': ['CCC_1']}

方法2:基于初始字典的推导式

如果已经有预设的初始字典,可以直接遍历字典的键,用列表推导式收集匹配的文件:

files = ['AAA_1', 'BBB_2', 'CCC_1', 'AAA_2', 'BBB_4']
initial_dict = {'AAA': [], 'BBB': [], 'CCC': []}

final_dict = {
    key: [file for file in files if file.startswith(key)]
    for key in initial_dict
}

这种方式逻辑直观,不需要额外排序,直接基于初始键筛选对应文件。

原推导式失效的原因

原推导式中,每遍历一个文件就生成一组{prefix: [file]}键值对。当同一个prefix多次出现时,后面的键值对会直接覆盖前面的,因此最终每个键只保留了最后一次遍历到的文件。

内容的提问来源于stack exchange,提问作者OdiumPura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:06:29