gpt4 book ai didi

python - 使用 '\n' .join(generator) 时添加尾部分隔符

转载 作者:行者123 更新时间:2023-12-01 09:03:47 30 4
gpt4 key购买 nike

前言:这类似于 Create lines of text, '\n'.join(my_list) is missing trailing newline :-( ,但这里它是一个生成器,而不是一个列表。

我需要从生成器函数生成一个文本文件,生成不以行终止的单独字符串行。

我相信构建这样一个字符串的推荐方法是(假设g是生成器对象)

'\n'.join(g)

但是这会错过尾随的换行符。

下面是使用 ',' 代替 '\n' 的示例:

>>> g=(str(i) for i in range(0,10))
>>> ','.join(g)
'0,1,2,3,4,5,6,7,8,9'

当然,我可以在最后手动添加 + '\n' 但我相信这可能会很昂贵。

我尝试使用 itertools.chain() 附加一个空字符串,但这给出了令人惊讶的结果:

>>> import itertools
>>> g=itertools.chain((str(i) for i in range(0,10)),'')
>>> ','.join(g)
'0,1,2,3,4,5,6,7,8,9'

我怎样才能真正做到呢? + '\n' 真的那么贵吗?

最佳答案

您可能会感到惊讶,但将生成器转换为列表、附加空 ("") 值并使用 str.join 将是您最快的方法这样做。

我喜欢你的想法,你希望使用生成器更高效,但是 "".join 实际上在加入之前将你的 genexp 在内部转换为列表。这样做的原因是它需要测量最终字符串的长度并相应地分配内存。这样它就会对生成器进行两次传递(基本上创建一个列表以暂时保存值)

py -3 -m timeit "''.join([str(i) for i in range(100000)])"
10 loops, best of 5: 29.6 msec per loop

py -3 -m timeit "''.join((str(i) for i in range(100000)))"
10 loops, best of 5: 32.3 msec per loop

也占用相同的内存。

关于python - 使用 '\n' .join(generator) 时添加尾部分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52243119/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com