不使用join或s删除重复字母

2024-05-16 09:51:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我的任务是删除字符串中的重复字母

remove_repeat(msg):

示例

  • remove_repeat("bookkeeper")'bokeper'
  • remove_repeat("aaabcaaddddeff")'abcadef'
  • remove_repeat("a")'a'

到目前为止我掌握的密码是

def remove_repeat(msg):

    removed=[]
    for i in msg:
        if i not in removed:
            removed.append(i)
    return removed

我不知道如何继续这个代码。我不允许使用“join”或“set”。给出了一个使用+=的提示,但我不知道如何在这里合并它


Tags: 字符串in密码示例fordef字母msg
3条回答

首先,第二个示例remove_repeat("aaabcaaddddeff") → 'abcadef'不会与代码一起出现。第二组a仍然会失败,因为“a”已经在remove中。您需要对照remove中的前一个字母测试每个字母。你知道吗

其次,+=with strings与append相同。以下几行是等效的。你知道吗

mystring += mychar
mystring = mystring + mychar

首先将remove初始化为msg中的第一个条目(因为它不能是重复的)。现在循环msg的其余部分,根据remove中的前一个字符测试每个新字符。如果不匹配

result += newchar

def remove_repeat(msg):
    previous = None
    result = ''
    for newchar in msg:
        if newchar != previous:
            result += newchar
            previous = newchar
    return result

如果您使用list来累积结果,那么将其转换回str的唯一好方法就是使用''.join。但由于这是一个类赋值,所以可能不好,只需重复str串联即可完全避免list

def remove_repeat(msg):
    newmsg = ''
    for let in msg:
        if let not in newmsg:
            newmsg += let
    return newmsg

这符合您的逻辑和规则,但它仍然会导致逻辑错误,因为目标是删除连续重复,而不是同一重复的所有重复。要修复此问题,只需跟踪最后一个字母:

def remove_repeat(msg):
    newmsg = ''
    for let in msg:
        # Only append if last letter of the string to date differs from this letter
        if let != newmsg[-1:]:  # Use slice to avoid special casing first letter
            newmsg += let
    return newmsg

let != newmsg[-1:]也可以作为not newmsg.endswith(let)完成,不确定是否允许使用str方法,所以我坚持使用切片测试。你知道吗

作为记录,如果我在一个类之外实现这个,并且输入可能很大(我非常需要优化它,谁知道为什么),我会:

 from operator import itemgetter
 from itertools import groupby

 def remove_repeat(msg):
     return ''.join(map(itemgetter(0), groupby(msg)))

但这可能有点太聪明了。groupby将连续的重复字母分组,map(itemgetter(0),保持组键(重复组的单个字母),并且''.join将所有字母重新缝合在一起。你知道吗

请注意,前面的两个解决方案都会删除每个字母后面的所有副本,而不仅仅是紧跟其后的副本。你知道吗

相反

def remove_repeat(msg):
    previous = None
    result = ''
    for ch in msg:
        if ch != previous:
            result += ch
            previous = ch
    return result

相关问题 更多 >