在字符串中的每个字符前后放置一个符号

时间:2014-02-04 14:08:20

标签: python string python-2.7

我想为字符串中的每个字符添加括号。所以

"HelloWorld"

应该成为:

"[H][e][l][l][o][W][o][r][l][d]"

我使用过这段代码:

word = "HelloWorld"
newWord = ""
for letter in word:
    newWord += "[%s]" % letter

这是最简单的方法,但字符串连接非常慢。 有关加快此代码的任何建议。

3 个答案:

答案 0 :(得分:5)

>>> s = "HelloWorld"
>>> ''.join('[{}]'.format(x) for x in s)
'[H][e][l][l][o][W][o][r][l][d]'

如果字符串很大,那么使用带有列表推导的str.join比使用生成器表达式(https://stackoverflow.com/a/9061024/846892)更快且内存效率更高:

>>> ''.join(['[{}]'.format(x) for x in s])
'[H][e][l][l][o][W][o][r][l][d]'

来自Python performance tips

避免这种情况:

s = ""
for substring in list:
    s += substring

请改用s = "".join(list)。在构建大型字符串时,前者是一个非常常见和灾难性的错误。

答案 1 :(得分:1)

最狡猾的方式可能是生成器理解:

>>> s = "HelloWorld"
>>> "".join("[%s]" % c for c in s)
'[H][e][l][l][o][W][o][r][l][d]'

Ashwini Chaudhary的答案非常相似,但使用了现代(Python3)字符串格式功能。 <{1}}的旧字符串插值仍然可以正常工作,并且更简单。

更具创造性,在每个角色之间插入%,并用][围绕它们。我猜测这可能会有点快,因为它没有那么多的字符串插值,但速度不应该是这里的问题。

[]

答案 2 :(得分:1)

如果您担心速度并需要快速实现,请尝试确定将迭代卸载到下划线本机模块的实现。至少在CPython中也是如此。

建议实施

"[{}]".format(']['.join(s))

<强>输出

'[H][e][l][l][o][W][o][r][l][d]'

与竞争解决方案进行比较

In [12]: s = "a" * 10000

In [13]: %timeit "[{}]".format(']['.join(s))
1000 loops, best of 3: 215 us per loop

In [14]: %timeit ''.join(['[{}]'.format(x) for x in s])
100 loops, best of 3: 3.06 ms per loop

In [15]: %timeit ''.join('[{}]'.format(x) for x in s)
100 loops, best of 3: 3.26 ms per loop