使用“\n”时添加尾部分隔符。联接(生成器)

2024-04-23 15:46:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我需要从一个生成器函数生成一个文本文件,该函数生成的字符串行不是以行结尾的。你知道吗

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

'\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'真的那么贵吗?你知道吗


Tags: of函数字符串textinchainformy
1条回答
网友
1楼 · 发布于 2024-04-23 15:46:07

听到这个消息您可能会感到惊讶,但是将生成器转换为一个列表、附加空("")值并使用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

同样的记忆。你知道吗

相关问题 更多 >