删除重复的字母,不使用连接或设置

时间:2016-03-07 17:30:30

标签: python python-3.x

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

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'。给出的提示是使用+ =但我不知道如何将其合并到这里

3 个答案:

答案 0 :(得分:3)

如果您使用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将它们全部拼接在一起。

答案 1 :(得分:0)

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

相反,

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

答案 2 :(得分:0)

首先,您的第二个示例remove_repeat("aaabcaaddddeff") → 'abcadef'不会出现在您的代码中。第二组a仍然会失败,因为' a'已经在remove。您需要在删除时针对前一个前一个测试每个字母。

其次,+ =与字符串是相同的附加。以下几行是等效的。

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