8

ユーザーが次のように入力したとします。

"daslakndlaaaaajnjndibniaaafijdnfijdnsijfnsdinifaaaaaaaaaaafnnasm"

連続する「a」の最大数を見つける方法と、「a」を削除して、以前の多数の代わりに 2 つだけを残す方法を教えてください。

各文字を新しい空のリストに追加することを考えていましたが、それが正しいかどうか、またはその後何をすべきかわかりません。

どこから始めればいいのか本当にわかりませんが、これが私が考えていることです:

  1. ユーザーに入力を求めます。
  2. 空のリストを作成する
  3. 入力からの各文字をリストに追加します

次はどうなるかわかりません。

2番目の編集(これらの行に沿ったもの):

sentence = input("Enter your text: ")
new_sentance = " ".join(sentence.split())
length = len(new_sentance)
alist = []
while (length>0):
    alist
print ()
4

5 に答える 5

5

入力文字列から始めます。

input = "daslakndlaaaaajnjndibniaaafijdnfijdnsijfnsdinifaaaaaaaaaaafnnasm"
  • 最大連続発生回数を取得するには、次を使用します。

    max(len(s) for s in re.findall(r'a+', input))
    
  • "a" の連続した最長のシーケンスのみを 2 つの "a" に置き換えるには、次のようにします。

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

    MatchObject最初に、入力文字列を regex に対してテストして s のiterable を取得しa+、次に を使用して最大の長さmaxの を取得します。MatchObject次に、一致の開始までの元の文字列の部分、文字列 "aa"、および一致の終了後の元の文字列の部分をつなぎ合わせて、最終的な出力を提供します。

  • 2 つ以上の "a" をすべて2 つの "a"に置き換えるには、次のようにします。

    output = re.sub(r'a{3,}', "aa", input)
    
于 2013-09-13T03:41:39.320 に答える
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
于 2013-09-13T02:34:46.027 に答える
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

私のコーディング スタイルが気に入らない人もいるかもしれませんが、私にとって、このコードは非常に簡単に理解できます。

于 2013-09-13T02:57:44.817 に答える
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

私が見た正規表現の答えはどちらも、「aa +」のすべての文字列を2つの「a」に置き換えると確信しています。'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'
于 2013-09-13T01:53:17.750 に答える