使用列表删除重复字符的第一次出现

时间:2016-03-04 18:37:34

标签: python

我正在尝试创建一个函数,当给定一个字符串时,将删除重复字符的第一个错误。但有一个细节让我感到高兴:不连续的角色不是重复的。因此,'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

4 个答案:

答案 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]