如何在Python中将一个字符串的空格复制到另一个字符串?

4

我需要一种方法将一个有空格的字符串中所有空格的位置复制到另一个没有空格的字符串中。

例如:

string1 = "This is a piece of text"
string2 = "ESTDTDLATPNPZQEPIE"

output = "ESTD TD L ATPNP ZQ EPIE"
3个回答

3
在使用str.join函数之后,将字符插入到占位符列表中并进行连接。
it = iter(string2)
output = ''.join(
    [next(it) if not c.isspace() else ' ' for c in string1]  
)

print(output)
'ESTD TD L ATPNP ZQ EPIE'

这种方法很高效,因为它避免了重复的字符串拼接。


为什么要用 .isspace()?虽然非常聪明 :) - Joe Iddon
@JoeIddon 在我看来比 c == ' ' 更加简洁,谢谢。我喜欢你的生成器解决方案,这也是我自己想到的第一件事情。 - cs95
@JoeIddon 你可以阅读 Raymond Hettinger 的这个优秀回答 - cs95
非常有趣!但是如果不像我的答案那样使用推导式的情况下,那该怎么办呢……那里先传入list()会更快吗? - Joe Iddon
此外,当Raymond说:“如果你给它一个列表,它可以立即开始工作。如果你给它一个genexp,它在构建新列表之前无法开始工作”,如果你必须自己创建列表,那么我明白这将为str.join调用节省时间,但你已经失去了通过创建生成器而节省的所有时间。尽管我确实同意它更快了,但现在我已经检查过了;这只是关闭生成器的开销吗? - Joe Iddon
显示剩余2条评论

2
您需要使用enumerate()迭代string1中的索引和字符。

在每次迭代时,如果字符是空格,请将一个空格添加到输出字符串(请注意,这是低效的,因为您正在创建新对象,而字符串是不可变的),否则将string2中该索引处的字符添加到输出字符串中。

所以代码看起来像:

output = ''
si = 0
for i, c in enumerate(string1):
    if c == ' ':
         si += 1
         output += ' '
    else:
         output += string2[i - si]

然而,更高效的方法是使用类似的生成器和str.join方法。这可以避免向输出字符串进行缓慢的连接操作。
def chars(s1, s2):
    si = 0
    for i, c in enumerate(s1):
        if c == ' ':
            si += 1
            yield ' '
        else:
            yield s2[i - si]
output = ''.join(char(string1, string2))

0
你可以尝试使用插入方法:
string1 = "This is a piece of text"
string2 = "ESTDTDLATPNPZQEPIE"


string3=list(string2)

for j,i in enumerate(string1):
    if i==' ':
        string3.insert(j,' ')
print("".join(string3))

输出:

ESTD TD L ATPNP ZQ EPIE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接