【问题标题】:Efficient way to add spaces between characters in a string在字符串中的字符之间添加空格的有效方法
【发布时间】:2025-12-07 06:45:01
【问题描述】:

假设我有一个字符串s = 'BINGO';我想遍历字符串以生成'B I N G O'

这就是我所做的:

result = ''
for ch in s:
   result = result + ch + ' '
print(result[:-1])    # to rid of space after O

有没有更有效的方法来解决这个问题?

【问题讨论】:

  • 在我的机器上,这大约需要 500ns。这真的是您程序中的瓶颈吗?如果没有,不要问效率;询问简单性、可读性等——真正重要的事情。
  • @abarnert 或许 efficient 对您来说意味着某些特殊的东西,但它实际上 不一定意味着 machine 效率。
  • @kojiro:“高效”是指门徒/专业/爱好/等方面的特殊事物。计算机编程,这就是这个网站的内容,所以这就是重要的定义。这就是为什么这个网站有一个专门用于该目的的效率标签。
  • 是的,@abarnert 是对的——这个解决方案的问题首先不是它效率低下,而是它不是 Python 的,也不简单。 ' '.join(s) 是简单的 Pythonic 方式。但是,效率是一个问题,因为上面的解决方案是O(N^2),而joinO(N)——这对'BINGO' 无关紧要,但对长字符串很重要。
  • @BenHoyt:它看起来与小字符串呈线性关系的原因是,复制字符串基本上只是对 memmove 的调用——当然,它仍然循环,但它在通常高度优化的 C 代码中这样做对于平台(尤其是在 x86 上,它具有专门设计用于加速 memmove 的操作码)。因此,第二个 N 上的常数乘数比第一个上的要小几个数量级,这使得在 N 变得非常大之前很难看到。

标签: python string


【解决方案1】:
s = "BINGO"
print(" ".join(s))

应该这样做。

【讨论】:

  • str.join 文档的解释:S.join(iterable) -> string 返回一个字符串,它是可迭代中字符串的串联。 元素之间的分隔符是S。
  • 正确,完全正确。 Python 将单个字符串视为可迭代对象,因此它将用空格连接每个字符(可迭代对象中的元素)。
【解决方案2】:
s = "BINGO"
print(s.replace("", " ")[1: -1])

时间如下

$ python -m timeit -s's = "BINGO"' 's.replace(""," ")[1:-1]'
1000000 loops, best of 3: 0.584 usec per loop
$ python -m timeit -s's = "BINGO"' '" ".join(s)'
100000 loops, best of 3: 1.54 usec per loop

【讨论】:

  • 这很有趣,知道为什么替换方法更快吗?
  • @MikeVella 猜测可能与 Python 的源代码有一个 special case replace handler 用于在 from 字符串为空字符串时进行交错的事实有关。
  • 顺便说一句,我认为如果它为几个不同的字符串大小提供timeit 值,这个答案会更好。
  • 如何将其转换为每 n 位放置空格?
  • @MikeSchem,[1:-1] 不会添加任何东西 - 它会删除东西。如果您尝试不使用它,您会看到开头和结尾有多余的空格。您也可以根据您的用例使用.strip()
【解决方案3】:

Python 方式

一个非常pythonic和实用的方法是使用字符串join()方法:

str.join(iterable)

官方Python documentations说:

返回一个字符串,它是iterable中字符串的连接...元素之间的分隔符是提供此方法的字符串。

如何使用?

记住:这是一个字符串方法

此方法将应用于上面的str,它反映了将用作可迭代项的分隔符的字符串。

让我们举一些实际的例子!

iterable = "BINGO"
separator = " " # A whitespace character.
                # The string to which the method will be applied
separator.join(iterable)
> 'B I N G O'

实际上你会这样做:

iterable = "BINGO"    
" ".join(iterable)
> 'B I N G O'

但请记住,参数是可迭代的,例如字符串、列表、元组。虽然该方法返回一个字符串。

iterable = ['B', 'I', 'N', 'G', 'O']    
" ".join(iterable)
> 'B I N G O'

如果你使用连字符作为字符串会发生什么?

iterable = ['B', 'I', 'N', 'G', 'O']    
"-".join(iterable)
> 'B-I-N-G-O'

【讨论】:

    【解决方案4】:

    最有效的方法是接受输入,制作逻辑并运行

    所以代码是这样来制作你自己的空间制造商的

    need = input("Write a string:- ")
    result = ''
    for character in need:
       result = result + character + ' '
    print(result)    # to rid of space after O
    

    但如果你想使用 python 给出的内容,请使用此代码

    need2 = input("Write a string:- ")
    
    print(" ".join(need2))
    

    【讨论】: