反转特定词函数

Reverse a specific word function

我在执行下一个任务时遇到问题:

所以基本上,我需要构建一个接收(句子、单词、出现)的函数 它会搜索那个词并只在它出现的地方反转它 例如:

function("丹妮喜欢香蕉,丹妮也喜欢苹果", "lik", "2") returns: "Dani 喜欢香蕉,Dani 也 kiles 苹果"

如您所见,“单词”是 'lik' 并且在第二次出现时反转为 'kil'。

我写了一些东西,但它太乱了,那部分仍然不适合我,

def q2(sentence, word, occurrence):
    count = 0
    reSentence = ''
    reWord = ''
    for char in word:
        if sentence.find(word) == -1:
            print('could not find the word')
            break
        for letter in sentence:
            if char == letter:
                if word != reWord:
                    reWord += char
                    reSentence += letter
                    break
                elif word == reWord:
                    if count == int(occurrence):
                        reWord = word[::-1]
                        reSentence += reWord
                    elif count > int(occurrence):
                        print("no such occurrence")
                    else:
                        count += 1
            else:
                reSentence += letter
    print(reSentence)

sentence = 'Dani likes bananas, Dani also likes apples'
word = 'li'
occurrence = '2'
q2(sentence,word,occurrence)

现在的主要问题是,在它中断后它会返回检查句子的开头,因此它会在“Dani”中找到 i。我想不出一种方法让它从停止的地方开始检查。 我尝试使用枚举,但仍然不知道如何使用。

  1. 索引=Find index of nth occurence
  2. 使用 slice notation 获取您感兴趣的部分(您有它的开头和长度)
  3. Reverse it
  4. 构造您的结果字符串:
result = sentence[:index] + reversed part + sentence[index+len(word):]

这将适用于给定的场景

scentence = 'Dani likes bananas, Dani also likes apples'
word = 'lik'
st = word
occ = 2
lt = scentence.split(word)
op = ''
if (len(lt) > 1):
    for i,x in enumerate(lt[:-1]):
        if (i+1) == occ:
            word =  ''.join(reversed(word))  
        op = op + x + word
        word = st
        
print(op+lt[-1])

请自行测试其他场景

这一行 for i,x in enumerate(lt[:-1]) 基本上在不包括最后一个元素的列表上循环。使用 enumerate 我们可以获得 i 列表中元素的索引和 x 中元素的值.因此,当代码循环通过它时,我会使用我打破的相同单词重新加入拆分列表,但我会在您想要的指定位置更改单词。循环时排除最后一个元素的原因是因为在循环内部有单词的添加,并且在每个元素列表之后,如果我包含整个列表,最后会有额外的单词。希望解释清楚。

您的做法表明您已经清楚地思考了问题并正在使用您熟知的方法来解决问题。但是,您的代码有太多问题无法简单修复,例如:

  • 您只需在进入循环后检查单词的出现;
  • 你为单词中的每个字母遍历整个句子;
  • 您一次只比较一个字符,并且在跟踪到目前为止匹配的数量时犯了一些错误。
  • 您传递了一个字符串 '2',您打算将其用作数字 2

所有这些问题和其他问题都可以解决,但是您最好使用该语言提供给您的内容。您的任务分解为:

  • 找到字符串中第 n 次出现的子串
  • 用找到的另一个词替换它,return 字符串

请注意,您并不是真正在寻找 'word' 本身,因为您的示例显示您只替换了单词的一部分(即 'lik'),而 'word' 是通常理解为单词边界之间的整个单词。

def q2(sentence, word, occurrence):
    # the first bit
    position = 0
    count = 0
    while count < occurrence:
        position = sentence.find(word, position+1)
        count += 1
        if position == -1:
            print (f'Word "{word}" does not appear {occurrence} times in "{sentence}"')
            return None

    # and then using what was found for a result
    return sentence[0:position] + word[::-1] + sentence[position+len(word):]

print(q2('Dani likes bananas, Dani also likes apples','lik',2))
print(q2('Dani likes bananas, Dani also likes apples','nope',2))

关于 return 声明的一些解释:

  • sentence[0:position] 从开头 0position 之前的字符得到 sentence,这称为 'slice'
  • word[::-1] 从头到尾获取单词,但要倒过来 -1。省略切片中的值意味着 'from one end to the other'
  • sentence[position+len(word):]从位置position + len(word)开始得到sentence,也就是找到的单词之后的字符,直到结束(没有索引,所以全部拿走)。

所有这些加在一起就是您需要的结果。

请注意,函数 returns None 如果找不到正确次数的单词 - 这可能不是您所需要的。

import re
from itertools import islice

s = "Dani likes bananas, Dani also likes apples"
t = "lik"
n = 2

x = re.finditer(t, s)
try:
    i = next(islice(x, n - 1, n)).start()
except StopIteration:
    i = -1

if i >= 0:
    y = s[i: i + len(t)][::-1]
    print(f"{s[:i]}{y}{s[i + len(t):]}")
else:
    print(s)

使用 Regex 查找第二个起始索引(如果存在)。在最坏的情况下,可能需要两次遍历字符串 s,一次用于查找索引,一次用于形成输出。这也可以使用两个指针一次完成,但我会把它留给你。据我所知,还没有人提供过一次性解决方案。