我的任务是删除字符串中的重复字母
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'。给出的提示是使用+ =但我不知道如何将其合并到这里
答案 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