如何通过有效地连接字符来构造字符串?

时间:2016-03-04 13:11:00

标签: python string

我有一个长字符串s1,以及此字符串中字符lst = [...]的位置列表。我想构造一个字符串s2,其中s1给出的位置只包含lst的字符。我怎样才能有效地做到这一点?

2 个答案:

答案 0 :(得分:11)

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])

答案 1 :(得分:7)

或者,使用operator.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

编辑:我也认为代码不应该跳过那些没有意义的列表。如果列表中有无意义的索引,您希望代码引发IndexError,然后从那里恢复。