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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:47:12