如何在字符串列表中替换第n次出现的元素而不使用内置函数
我刚开始学习Python,遇到一个问题,就是想写一个脚本,接收四个元素(比如字符串、要替换的字符、替换成的字符和n),然后找到这些字符并替换第n次出现的地方。
举个例子:
>>> replaeceit("Mississippi", "s", "l", 2)
'Mislissippi'
>>> replaeceit("Mississippi", "s", "l", 0)
'Mississippi'
这里的n是2,所以代码会把第二个s替换成l……而当n=0时,就什么都不做。
老实说,我不知道怎么把n加到这个公式里,这是我目前写的代码,没有用到n。
def replaceit(str,replacefrom,replaceto):
new=""
for letter in str:
if letter== replacefrom:
new=new+replaceto
else:
new=new+letter
return new
3 个回答
0
大家总是喜欢生成器表达式。
from itertools import count
def replaceit(str, replacefrom, replaceto, n):
c = count(1)
return ''.join(replacefrom if l == replaceto and c.next() == n else l for l in str)
1
这是我第二次尝试理解你的问题:
def replaceit(s, replacefrom, replaceto, n):
new_s, count = '', 0
for letter in s:
if letter == replacefrom:
count += 1
if count == n:
new_s += replaceto
continue
new_s += letter
return new_s
这个和你的例子是匹配的:
>>> replaceit("Mississippi", "s", "l", 2)
'Mislissippi'
>>> replaceit("Mississippi", "s", "l", 0)
'Mississippi'
如果这不是你想要的,请更清楚地解释一下。
你也可以用正则表达式达到同样的效果:
def replaceit(s, replacefrom, replaceto, n):
import re
if n <= 0:
return s
return re.sub('(.*?%s)%s' % (('%s.*?' % replacefrom) * (n-1), replacefrom), r'\1%s' % replaceto, s)
3
好的,也许我现在明白你想要什么了:
def replaceit(st, remove, put, pos):
outs = ""
count = 0
for letter in st:
if letter == remove:
count += 1
if count == pos:
outs += put
else:
outs += letter
else:
outs += letter
return outs
输出结果:
In [84]: replaceit("Mississipi", "s", "l", 2)
Out[84]: 'Mislissipi'
当然,你可以检查一下参数 no2 和 no3 是否是长度为 1 的字符串。