如何用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
相关产品推荐
相关产品推荐

