我正在尝试创建一个函数,当给定一个字符串时,将删除重复字符的第一个错误。但有一个细节让我感到高兴:不连续的角色不是重复的。因此,'bookkeeper'
将为'bokeper'
,但我的函数会吐出'bokepr'
。我怎样才能解决这个问题?这是我的功能。
def remove_repeat(message):
placeholder = [] #The spot that our answer will be built up in
seen_chars = [] #The place that will hold our seen characters
for c in message:
if c not in seen_chars:
seen_chars.append(c)
if c not in placeholder:
placeholder.append(c)
result = ""
for c in placeholder:
result = result + c
return result
答案 0 :(得分:2)
您可以使用itertools.groupby()
将所有连续字符替换为一次(这似乎是您尝试做的事情):
>>> "".join(k for k, it in itertools.groupby("bookkeeper"))
'bokeper'
答案 1 :(得分:1)
def remove_repeat(message):
result = []
curr = None
for c in message:
if c != curr:
curr = c
result.append(c)
return "".join(result)
答案 2 :(得分:0)
此算法类似于Dyno Fu,但不是使用变量来存储前一个字符,我们使用zip
函数在字符串数据的两个副本上并行迭代一个位置。为了创建偏移数据,我们将字符串的副本转换为列表&因为我们不能将None
对象放入字符串中,所以会先添加None
。
def remove_repeat(msg):
return ''.join([d for c, d in zip([None] + list(msg), msg) if d != c])
print(remove_repeat('bookkeeper'))
<强>输出强>
bokeper
使用列表推导构建字符串然后使用.join
将结果转换为字符串是Python中相当标准的习惯用法,因为它比重复字符串连接更有效。 Python的现代版本已经为小字符串优化了字符串连接,但是你会看到字符串长度大于100个字符的显着差异。
答案 3 :(得分:0)
我想使用正则表达式添加另一个解决方案。有点不清楚“booo”这样的东西是否应该变成“bo”(删除除了一个重复之外的所有内容)或“boo”(删除一个副本)。所以这里有两个解决方案:
删除一个副本:
>>> import re
>>> s = 'bookkeeperrrr'
>>> re.sub(r'(.)(\1+)', r'\2', s)
'bokeperrr'
我们正在寻找至少重复两次的任何字符,然后将该模式的匹配替换为匹配减去其中一个重复字符。
删除除一个副本之外的所有副本:
>>> re.sub(r'(.)(\1+)', r'\1', s)
'bokeper'
这里的逻辑相同,但我们只用一个重复的字符代替。
如果“任何字符”过于笼统,请将正则表达式中的点替换为您喜欢的任何字符类,例如[a-zA-Z]
。