假设用户输入:
"daslakndlaaaaajnjndibniaaafijdnfijdnsijfnsdinifaaaaaaaaaaafnnasm"
你如何找到最高数量的连续“a”以及如何删除“a”并且只留下其中的2个而不是之前的大量数字。
我在考虑将每个字母附加到一个新的空列表中,但我不确定这是否正确或者该怎么做。
我真的不知道从哪里开始,但这就是我的想法:
下一步我不知道。
第二次编辑(沿着这些方向):
sentence = input("Enter your text: ")
new_sentance = " ".join(sentence.split())
length = len(new_sentance)
alist = []
while (length>0):
alist
print ()
答案 0 :(得分:4)
从输入字符串开始:
input = "daslakndlaaaaajnjndibniaaafijdnfijdnsijfnsdinifaaaaaaaaaaafnnasm"
要获得最大连续出现次数,请使用:
max(len(s) for s in re.findall(r'a+', input))
用2“a”替换最长的“a”序列, 你会用:
maxMatch = max(re.finditer(r'a+', input), key= lambda m: len(m.group()))
output = input[:maxMatch.start()] + "aa" + input[maxMatch.end():]
首先,我通过针对正则表达式MatchObject
测试输入字符串获得a+
s的可迭代,然后使用max
获取具有最大长度的MatchObject
。然后,我将原始字符串的部分拼接到匹配的开头,字符串“aa”,以及匹配结束后原始字符串的部分,以便为您提供最终输出。
要用2“a”替换超过2“a”的所有次出现,你 会使用:
output = re.sub(r'a{3,}', "aa", input)
答案 1 :(得分:3)
如果您不想使用正则表达式,则采用较低级别的方法。
def count_and_reduce(s, a):
num = 0
maxnum = 0
out = ''
for c in s:
if c == a:
num += 1
maxnum = max(num, maxnum)
else:
num = 0
if num <= 2:
out += c
return maxnum, out
答案 2 :(得分: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
我很确定我见过的两个正则表达式的答案都会用'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'
答案 3 :(得分:2)
我会这样做。
s = "daslakndlaaaaajnjndibniaaafijdnfijdnsijfnsdinifaaaaaaaaaaafnnasm"
print(s)
a_len = len(s)
found_a_len = 0
keep_going = True
while a_len>0 and keep_going:
aas = "a" * a_len
if aas in s:
found_a_len = a_len
keep_going = False
a_len=a_len -1
print ("max length of a:" , found_a_len)
keep_going = True
while keep_going:
s=s.replace("aaa","aa")
if "aaa" not in s:
keep_going = False
print(s)
此输出:
daslakndlaaaaajnjndibniaaafijdnfijdnsijfnsdinifaaaaaaaaaaafnnasm
max length of a: 11
daslakndlaajnjndibniaafijdnfijdnsijfnsdinifaafnnasm
有些人可能不喜欢我的编码风格,但对我来说,这段代码很容易理解。
答案 4 :(得分:0)
试试这个:
import collections
def runLenEncode(s):
start, i = 0, 0;
answer = []
while i<len(s):
while i<len(s) and s[start]==s[i]:
i += 1
answer.append((s[start], i-start))
start = i
return answer
def runLenFilter(encoding, thresholds, repLens):
answer = []
for char, count in encoding:
if char in thresholds and count>=thresholds[char]:
count = repLens[char]
answer.append(char*count)
return ''.join(answer)
def maxFilter(encoding, repLens):
maxCounts = collections.defaultdict(int)
for char, count in encoding:
if char in repLens and count > maxCounts[char]:
maxCounts[char] = count
maxCounts = dict(maxCounts)
answer = []
for char, count in encoding:
if char in repLens and count==maxCounts[char]:
count = repLens[char]
answer.append(char*count)
return ''.join(answer)
if __name__ == "__main__":
print('starting')
s = "daslakndlaaaaajnjndibniaaafijdnfijdnsijfnsdinifaaaaaaaaaaafnnasm"
encoding = runLenEncode(s)
print("encoding:", encoding)
thresholds = {'a':3}
repLens = {'a':2}
decoded = runLenFilter(encoding, thresholds, repLens)
print('lenFilter:', decoded)
filtered = maxFilter(encoding, repLens)
print("maxFilter:", filtered)
print('done')
输出:
$ python3 myFile.py
starting
encoding: [('d', 1), ('a', 1), ('s', 1), ('l', 1), ('a', 1), ('k', 1), ('n', 1), ('d', 1), ('l', 1), ('a', 5), ('j', 1), ('n', 1), ('j', 1), ('n', 1), ('d', 1), ('i', 1), ('b', 1), ('n', 1), ('i', 1), ('a', 3), ('f', 1), ('i', 1), ('j', 1), ('d', 1), ('n', 1), ('f', 1), ('i', 1), ('j', 1), ('d', 1), ('n', 1), ('s', 1), ('i', 1), ('j', 1), ('f', 1), ('n', 1), ('s', 1), ('d', 1), ('i', 1), ('n', 1), ('i', 1), ('f', 1), ('a', 11), ('f', 1), ('n', 2), ('a', 1), ('s', 1), ('m', 1)]
lenFilter: daslakndlaajnjndibniaafijdnfijdnsijfnsdinifaafnnasm
maxFilter: daslakndlaaaaajnjndibniaaafijdnfijdnsijfnsdinifaafnnasm
done