【问题标题】:Count the number of max consecutive "a"'s from a string. Python 3计算字符串中最大连续“a”的数量。蟒蛇 3
【发布时间】:2013-09-17 13:07:02
【问题描述】:

假设用户输入:

"daslakndlaaaaajnjndibniaaafijdnfijdnsijfnsdinifaaaaaaaaaaafnnasm"

您将如何找到最多的连续“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 ()

【问题讨论】:

  • 这是一个非常巧妙的问题。它只需要一个更好的标题。我认为您想使用 正则表达式 xkcd.com/208
  • 要获得最大数量,您可以使用max(len(s) for s in re.findall(r'a+', inputString))。要将所有出现的超过 2 个“a”替换为 2 个“a”,您可以使用:output = re.sub(r'a{3,}', "aa", inputString)
  • 这是一个相当有趣的问题。但是你真的应该发布一个尝试,这样你就可以证明更多的重新投票是合理的
  • 我现在有一个解决方案给你。请发布尝试,以便更多用户有动力投票重新开放,以便我可以实际发布我为您提供的解决方案
  • 只需编写执行上述步骤 1-3 的代码即可。你不必展示一个完整的解决方案,你只需要展示对问题的最低限度的理解。在代码中。

标签: python sorting python-3.x count


【解决方案1】:

从输入字符串开始:

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():]
    

    首先,我通过针对正则表达式a+ 测试输入字符串来获得MatchObjects 的可迭代,然后使用max 获得最大长度的MatchObject。然后,我将原始字符串的部分拼接到匹配的开头,字符串“aa”,以及匹配结束后的原始字符串部分,为您提供最终输出。

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

    output = re.sub(r'a{3,}', "aa", input)
    

【讨论】:

    【解决方案2】:

    如果您不想使用正则表达式,请使用较低级别的方法。

    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
    

    【讨论】:

      【解决方案3】:

      我在 cmets 和另一个问题中看到了几个正则表达式的答案,所以我要走一条不同的路。可以通过多种不同的方式进行计数。

      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'
      

      【讨论】:

      • 使用正则表达式可以更方便地完成最长序列的替换。请看我的回答。
      • @Asad 我明确表示我在回答中精确地 避免使用正则表达式,因为我认为你已经涵盖了它。因此,我当然希望任何好奇的读者也能在不被告知两次的情况下阅读您的答案。 ;)
      • 我说的是你回答的这一部分:“我很确定我见过的两个正则表达式答案都会用两个 'a' 替换每个 'aa+' 字符串。” 。也可以使用正则表达式完成 only 最长字符串的替换。
      【解决方案4】:

      我会这样做的方式。

      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
      

      有些人可能不喜欢我的编码风格,但对我来说,这段代码很容易推理。

      【讨论】:

      • @dkentre 请记住,StackExchange 是为您的问题和这个答案的未来读者准备的,如果您能说出这个答案是什么让您最喜欢它,那将会很有帮助。 :) 它对你来说更具可读性吗?快点?它是否包含您正在寻找的特定编码风格?
      【解决方案5】:

      试试这个:

      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
      

      【讨论】:

        猜你喜欢
        • 2013-09-17
        • 2019-04-30
        • 2021-07-22
        • 1970-01-01
        • 1970-01-01
        • 2022-11-24
        • 2019-11-21
        • 1970-01-01
        • 2020-08-30
        相关资源
        最近更新 更多