如何用Python列表推导式实现特定格式的列表转换?
列表转换的优雅实现方法
需求说明
给定初始列表:
data = ['1', '12', '123']
需要生成一个新列表,每个元素前添加带$的长度标识,最终格式如下:
result = ['$1', '1', '$2', '12', '$3', '123']
其中$后的数字是紧随其后元素的长度。
常规的for循环实现如下:
result = [] for element in data: result += [f'${len(element)}'] + [element]
但希望找到更优雅的实现方式,比如列表推导式,不过直接嵌套推导式会生成嵌套列表,展平写法可读性较差,因此寻求更优方案。
优雅实现方案
1. 使用itertools.chain(推荐)
借助itertools.chain.from_iterable可以高效展平迭代器,写法直观且性能较好:
from itertools import chain data = ['1', '12', '123'] result = list(chain.from_iterable((f'${len(e)}', e) for e in data))
chain.from_iterable会逐个遍历每个元组中的元素,避免了列表拼接带来的内存开销,同时代码逻辑清晰,一眼就能看出是将每个元素对应的标识和元素本身依次展开。
2. 生成器函数(逻辑最清晰)
通过自定义生成器函数,把转换逻辑拆分,可读性拉满,适合需要复用逻辑的场景:
def transform_data(data): for e in data: yield f'${len(e)}' yield e data = ['1', '12', '123'] result = list(transform_data(data))
这种写法完全贴合需求逻辑:遍历每个元素,先输出长度标识,再输出元素本身,后续维护或修改逻辑都非常方便。
3. 优化版列表推导式
如果不想导入模块,可以用双层列表推导式的简化写法,比嵌套展平的版本可读性更强:
data = ['1', '12', '123'] result = [item for e in data for item in (f'${len(e)}', e)]
这里直接将每个元素对应的两个项放在元组中,通过双层循环依次取出,代码简洁且逻辑明确。
方案对比
- 原生
for循环:最基础直观,适合新手理解,但代码稍显冗长。 itertools.chain:高效且可读性平衡,处理大数据量时优势明显。- 生成器函数:逻辑最清晰,复用性强,适合复杂场景或需要多次转换的需求。
- 优化版列表推导式:简洁无依赖,可读性优于嵌套展平的写法。
内容的提问来源于stack exchange,提问作者bontchev
相关产品推荐
相关产品推荐

