Python 如何通过有效地连接字符来构造字符串?
我有一个长字符串Python 如何通过有效地连接字符来构造字符串?,python,string,Python,String,我有一个长字符串s1,以及该字符串中字符的位置列表lst=[…]。我想构造一个字符串s2,它只包含s1中lst给定位置的字符。我怎样才能有效地做到这一点 newstring = "".join(s1[i] for i in lst) 如果您不完全知道s1不会有太长的索引,请执行以下操作: newstring = "".join(s1[i:i+1] for i in lst) 速度较慢,但没有索引错误 编辑:我注意到在中使用列表理解而不是生成器表达式。join(…)更有效,因此,只需添加括号:
s1
,以及该字符串中字符的位置列表lst=[…]
。我想构造一个字符串s2
,它只包含s1
中lst
给定位置的字符。我怎样才能有效地做到这一点
newstring = "".join(s1[i] for i in lst)
如果您不完全知道s1
不会有太长的索引,请执行以下操作:
newstring = "".join(s1[i:i+1] for i in lst)
速度较慢,但没有索引错误
编辑:我注意到在中使用列表理解而不是生成器表达式。join(…)
更有效,因此,只需添加括号:
newstring = "".join([s1[i] for i in lst])
或者,使用
操作符.itemgetter
:
>>> from operator import itemgetter
>>> s = '0123456789'
>>> lst = [0, 3, 6, 8]
>>> ''.join(itemgetter(*lst)(s))
'0368'
因为您要求提高效率,所以这应该比加入生成器快一点:
In [6]: timeit ''.join(s[i] for i in lst)
1000000 loops, best of 3: 1.18 µs per loop
In [7]: timeit ''.join(itemgetter(*lst)(s))
1000000 loops, best of 3: 430 ns per loop
编辑:我还认为代码不应该跳过没有意义的列表。如果列表中有无意义的索引,您希望代码生成一个
索引器
,然后从中恢复。如果索引大于字符串长度,则会生成索引错误。此外,在join()
中使用生成器表达式也不是很有效。lst是s1
中字符的位置,根据该定义,它不能超出它的范围bounds@Kasramvd当然,由OP使用有意义的输入数据/事先对其进行清理。OP没有提到他的名单可能没有意义。这个解决方案很好,而且很容易调整。@Kasramvd:是的,我添加了第二个解决方案。它可能比你的慢,但我不想从别人那里窃取解决方案@我也加了这个。你从“或者,…”开始。除了什么?还应与timeit''进行比较。加入([s[i]表示lst中的i])
。我这样做了,使用itemgetter
几乎没有什么不同(itemgetter
仍然稍微快一点)。我不想公布我的数字,因为它取决于机器等。我接受zondo的答案,因为时差似乎并不明显(见我之前的评论),我觉得它更具可读性。