如何在字符串列表中替换第n次出现的元素而不使用内置函数

2 投票
3 回答
3669 浏览
提问于 2025-04-16 08:04

我刚开始学习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 的字符串。

撰写回答