
本文介绍如何高效地将一个键映射到列表的字典(如 {'red': [1, 2], 'blue': [3, 4]})转换为扁平化的字符串列表(如 ['red_1', 'red_2', 'blue_3', 'blue_4']),重点推荐使用嵌套列表推导式实现,兼顾简洁性、可读性与性能。
本文介绍如何高效地将一个键映射到列表的字典(如 `{'red': [1, 2], 'blue': [3, 4]}`)转换为扁平化的字符串列表(如 `['red_1', 'red_2', 'blue_3', 'blue_4']`),重点推荐使用嵌套列表推导式实现,兼顾简洁性、可读性与性能。
在 Python 数据处理中,常需将“键–值列表”结构展开为键值组合的扁平序列。例如,颜色名称作为键,编号作为值列表,最终需生成带前缀的标识符列表。最直接且高效的方式是采用嵌套列表推导式(nested list comprehension):
myDict = {'red': [1, 2], 'blue': [3, 4]}
result = [f'{key}_{val}' for key, values in myDict.items() for val in values]
print(result)
# 输出: ['red_1', 'red_2', 'blue_3', 'blue_4']
该写法等价于以下显式循环逻辑,但更紧凑、更具 Python 风格:
result = []
for key, values in myDict.items():
for val in values:
result.append(f'{key}_{val}')
✅ 优势说明:
- 性能优异:避免多次 list.extend() 或临时列表拼接,一次生成完成;
- 内存友好:不产生中间列表(相比 sum([…], []) 或 itertools.chain 的显式调用);
- 语义清晰:双重 for 结构直观表达“对每个键→遍历其每个值”的映射关系。
⚠️ 注意事项:
- 确保 values 是可迭代对象(如 list、tuple、range);若存在 None 或非序列值,会触发 TypeError;建议预校验或使用 isinstance(values, abc.Iterable) 做防御性处理;
- 若需保持插入顺序(Python
- 如需自定义分隔符(如 '-' 或 ':'),仅需修改 f-string 中的连接符:f'{key}-{val}'。
? 拓展参考(其他可行方案):
- 使用 itertools.chain.from_iterable:
from itertools import chain result = list(chain.from_iterable([f'{k}_{v}' for v in vs] for k, vs in myDict.items())) - 使用 sum(不推荐,时间复杂度 O(n²)):
result = sum(([f'{k}_{v}' for v in vs] for k, vs in myDict.items()), [])
综上,嵌套列表推导式是解决此类字典展平组合问题的首选方案——它简洁、高效、符合 Python 惯例,适用于绝大多数实际场景。










