我有一个长字符串s1
,以及此字符串中字符lst = [...]
的位置列表。我想构造一个字符串s2
,其中s1
给出的位置只包含lst
的字符。我怎样才能有效地做到这一点?
答案 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
,然后从那里恢复。