Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过有效地连接字符来构造字符串?_Python_String - Fatal编程技术网

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的答案,因为时差似乎并不明显(见我之前的评论),我觉得它更具可读性。