计算字符串中最大连续"a"的数量.Python 3

dke*_*tre 7 python sorting count python-3.x

假设用户输入:

"daslakndlaaaaajnjndibniaaafijdnfijdnsijfnsdinifaaaaaaaaaaafnnasm"
Run Code Online (Sandbox Code Playgroud)

你将如何找到最高数量的连续"a",你将如何删除"a"并且只留下其中的2个而不是之前的大量数字.

我正在考虑将每个字母附加到一个新的空列表中,但我不确定这是正确的还是该怎么做.

我真的不知道从哪里开始,但这就是我的想法:

  1. 询问用户输入.
  2. 创建一个空列表
  3. 将输入中的每个字母附加到列表中

接下来我什么都不知道.

第二次编辑(沿着这些行):

sentence = input("Enter your text: ")
new_sentance = " ".join(sentence.split())
length = len(new_sentance)
alist = []
while (length>0):
    alist
print ()
Run Code Online (Sandbox Code Playgroud)

Asa*_*din 5

从输入字符串开始:

input = "daslakndlaaaaajnjndibniaaafijdnfijdnsijfnsdinifaaaaaaaaaaafnnasm"
Run Code Online (Sandbox Code Playgroud)
  • 要获得最大连续出现次数,您可以使用:

    max(len(s) for s in re.findall(r'a+', input))
    
    Run Code Online (Sandbox Code Playgroud)
  • 要仅用 2 个“a”替换最长的完整“a”序列,您可以使用:

    maxMatch = max(re.finditer(r'a+', input), key= lambda m: len(m.group()))
    output = input[:maxMatch.start()] + "aa" + input[maxMatch.end():]
    
    Run Code Online (Sandbox Code Playgroud)

    首先,我MatchObject通过根据 regex 测试输入字符串来获得 s的可迭代对象a+,然后使用max来获得MatchObject最大长度。然后,我将原始字符串的部分拼接到匹配的开头、字符串“aa”以及匹配结束后的原始字符串的部分,以给出最终的输出。

  • 要将所有出现的超过 2 个“a”替换为 2 个“a”,您可以使用:

    output = re.sub(r'a{3,}', "aa", input)
    
    Run Code Online (Sandbox Code Playgroud)


koj*_*iro 2

我在评论和其他问题中看到了一些正则表达式的答案,所以我将采取不同的方式。仅仅获得计数就可以通过多种不同的方式来完成。

from itertools import groupby

inp = 'daslakndlaaaaajnjndibniaaafijdnfijdnsijfnsdinifaaaaaaaaaaafnnasm';
char_groups = groupby(inp, lambda char:char=='a')
counts = [len(list(group)) for char, group in char_groups]
# We know every other element of 'counts' is an 'a' element.
# We just need to know whether to start at zero or one.
# If inp starts with 'a', start at 0. Otherwise start at 1.
max(counts[not inp.startswith('a')::2]) # 11
Run Code Online (Sandbox Code Playgroud)

我很确定我见过的两个正则表达式答案都会用两个“a”替换每个“aa+”字符串。如果您只想将最长的 'a' 字符串替换为 'aa' 并保留其余部分:

char_groups = groupby(inp)
counts = [(char, len(list(group))) for char, group in char_groups]
max_idx = max(range(len(counts)), key=lambda i:counts[i][1] if counts[i][0]=='a' else 0)
result = ''.join(char*count for char, count in counts[:max_idx]) + 'aa' + ''.join(char*count for char, count in counts[max_idx+1:])
# 'daslakndlaaaaajnjndibniaaafijdnfijdnsijfnsdinifaafnnasm'
Run Code Online (Sandbox Code Playgroud)