【问题标题】:How do I remove two consecutive same characters from a string?如何从字符串中删除两个连续的相同字符?
【发布时间】:2020-12-07 10:55:52
【问题描述】:

我正在尝试从字符串中连续删除相同的字符。例如:

         abb --> ab
         aaab --> ab
         ababa --> ababa (since no two consecutive characters are same)

我的代码:

T=int(input())
l=[0]
S1=""
for i in range(T):
    S=input()
    for j in range(len(S)-1):
        if S[j]!=S[j+1]:
            if S[j] != l[len(l)-1]:
                l=[]
                l.append(S[j])
                l.append(S[j+1])
                print(l)

            for k in l:
                S1+=k
            

    print(S1)
    S1=""
    l=[0]

代码不适用于第三种情况 (ababa)。我该如何解决这个问题?

【问题讨论】:

标签: python


【解决方案1】:

一种简洁的方法是使用itertools.groupby

from itertools import groupby

def clean(s):
    return ''.join(k for k, _ in groupby(s))

>>> clean("abb")
'ab'
>>> clean("aaab")
'ab'
>>> clean("ababa")
'ababa'

一种相当简化的基于二次循环的方法(在 cmets 中是线性的):

def clean(s):
    res = ""  # res = []
    for c in s:
        if not res or res[-1] != c:
            res += c  # res.append(c)
    return res  # return ''.join(res)

【讨论】:

  • 根据所描述的期望输出应该变成ab
  • Q 听起来像是家庭作业。我想知道在groupby 背后隐藏这么多问题会不会成功。
【解决方案2】:

一种冗长的方法,如果字符串很大,可能不是最有效的:

value = 'aaaaaabbbbaaaaaacdeeeeefff'

def no_dups(value):
    r = ''
    for i in value:
        if not r or r[-1] != i:
            r += i
    return r

print(no_dups(value))
# abacdef

【讨论】:

  • 它只是删除重复的,而不仅仅是连续的
  • @Hamza - 我没看到。他的例子看起来是对的。你能提供一个失败的输入吗?
【解决方案3】:

使用正则表达式,我们可以做到re.sub(r'([a-z])\1+', r'\1', string_data)

import re

test_data = 'abb aaab ababa'.split()

for data in test_data:
    print(f"{data} -->", re.sub(r'([a-z])\1+', r'\1', data))

【讨论】:

  • 这非常相似。是的!
【解决方案4】:

用这段代码出来,工作正常:

T=int(input())      #No of testcases; for testing multiple strings
S1=""
for i in range(T):
    S=input()
    for j in range(0,len(S),2):
        if j!=len(S)-1:
            if S[j]!=S[j+1]:
                S1+=S[j]
                S1+=S[j+1]
        else:
            if S1[len(S1)-1]!=S[j]:
                S1+=S[j]

    print(S1)
    S1=""
  

【讨论】:

    【解决方案5】:

    您可以将正则表达式用作:

    for char in set(string):
        string = re.sub(f'{char}+', char, string)
    string
    

    结果

     abb --> ab
     aaab --> ab
     ababa --> ababa
    

    【讨论】:

    • 确实是这样!我会让它更有效率!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多