【问题标题】:Python - removing repeated letters in a stringPython - 删除字符串中的重复字母
【发布时间】:2021-06-05 04:38:06
【问题描述】:

假设我有一个按字母顺序排列的字符串,基于字母重复的次数。

  • 示例:“BBBAADDC”。

有 3 个 B,所以它们在开头,2 个 A 和 2 个 D,所以 A 排在 D 前面,因为它们按字母顺序排列,还有 1 个 C。另一个例子是 CCCCAAABBDDAB。

请注意,中间某处可以有 4 个字母(即 CCCC),因为可能有 2 对 2 个字母。

但是,假设我只能连续输入 n 个字母。例如,如果在第二个示例中 n = 3,那么我将不得不从 4 个 C 的第一个子字符串中省略一个“C”,因为一行中最多只能有 3 个相同的字母。

另一个例子是字符串“CCDDDAABC”;如果 n = 2,我必须删除一个 C 和一个 D 才能得到字符串 CCDDAABC

输入/输出示例:

  1. n=2:输入:AAABBCCCCDE,输出:AABBCCDE
  2. n=4:输入:EEEEEFFFFGGG,输出:EEEEEFFFFGGG
  3. n=1:输入:XXYYZZ,输出:XYZ

如何用 Python 做到这一点?提前致谢!

这就是我现在所拥有的,虽然我不确定它是否在正确的轨道上。这里,z 是字符串的长度。

for k in range(z+1):
        if final_string[k] == final_string[k+1] == final_string[k+2] == final_string[k+3]: 
            final_string = final_string.translate({ord(final_string[k]): None})
return final_string

【问题讨论】:

  • 显示到目前为止您为解决此问题所做的工作。
  • 完成!对此感到抱歉。
  • 虽然我不确定它是否在正确的轨道上它会产生你想要的结果吗?
  • 不,绝对不是。我要么得到“字符串索引超出范围”,要么删除字符串中与“final_string[k]”相同的每个字符。
  • 我不确定实际的问题是什么。您只需要删除多余的重复字母吗?

标签: python string letter


【解决方案1】:
from itertools import groupby
n = 2
def rem(string):
    out = "".join(["".join(list(g)[:n]) for _, g in groupby(string)])
    print(out)

这就是你问题的全部代码。

s = "AABBCCDDEEE"
s2 = "AAAABBBDDDDDDD"
s3 = "CCCCAAABBDDABBB"
s4 = "AAAAAAAA"
z = "AAABBCCCCDE"

通过以下测试:

AABBCCDDEE
AABBDD
CCAABBDDABB
AA
AABBCCDE

【讨论】:

    【解决方案2】:

    好的,基于on your comment,您要么对字符串进行预排序,要么不需要按您尝试创建的函数对其进行排序。使用itertools.groupby(),您可以更轻松地做到这一点:

    import itertools
    
    def max_seq(text, n=1):
        result = []
        for k, g in itertools.groupby(text):
            result.extend(list(g)[:n])
        return ''.join(result)
    
    
    max_seq('AAABBCCCCDE', 2)
    # 'AABBCCDE'
    max_seq('EEEEEFFFFGGG', 4)
    # 'EEEEFFFFGGG'
    max_seq('XXYYZZ')
    # 'XYZ'
    max_seq('CCCDDDAABC', 2)
    # 'CCDDAABC'
    

    在每个g 组中,它被扩展然后切片直到n 元素([:n] 部分),因此您最多可以连续获得每个字母n 次。如果相同的字母出现在其他地方,则在连续计数n 时将其视为独立序列。


    编辑:这是一个较短的版本,对于很长的字符串也可能表现更好。当我们使用itertools 时,这个还使用itertools.chain.from_iterable() 来创建扁平化的字母列表。并且由于每个都是生成器,因此仅在最后一行进行评估/扩展:

    import itertools
    
    def max_seq(text, n=1):
        sequences = (list(g)[:n] for _, g in itertools.groupby(text))
        letters = itertools.chain.from_iterable(sequences)
        return ''.join(letters)
    

    【讨论】:

      【解决方案3】:

      这是我的解决方案:

      def snip_string(string, n):
          list_string = list(string)
          list_string.sort()
          chars = set(string)
          for char in chars:
              while list_string.count(char) > n:
                  list_string.remove(char)
          return ''.join(list_string)
      

      使用n 的各种值调用函数会得到以下输出:

      >>> string = "AAAABBBCCCDDD"
      >>> snip_string(string, 1)
      'ABCD'
      >>> snip_string(string, 2)
      'AABBCCDD'
      >>> snip_string(string, 3)
      'AAABBBCCCDDD'
      >>> 
      

      编辑

      这是我的解决方案的更新版本,它仅在重复字符的超过n时删除字符。

      import itertools
      
      def snip_string(string, n):
          groups = [list(g) for k, g in itertools.groupby(string)]
          string_list = []
          for group in groups:
              while len(group) > n:
                  del group[-1]
              string_list.extend(group)
          return ''.join(string_list)
      

      输出:

      >>> string = "DDDAABBBBCCABCDE"
      >>> snip_string(string, 3)
      'DDDAABBBCCABCDE'
      

      【讨论】:

      • 谢谢!但是,当我用更复杂的东西尝试这个时,比如“DDDAABBBBCCABCDE”,它返回“DDAABBCCABCDE”(对于n = 3),我不想要......我只想从“BBBB”中删除1个“B” “就是这样。您的代码删除了我不想要的 2 个 B。我将如何防止这种情况发生?
      • @OA_Elite 好的,我更新了我的答案,我相信它可以提供所需的输出。
      • 我明白了,非常感谢(我还不能投票 :()。我也会给出这个最佳答案,但不幸的是,我不能!这和下面的工作,但是。再次感谢!!!
      【解决方案4】:
      hello = "hello frrriend"
      
      
      def replacing() -> str:
          global hello
          j = 0
          for i in hello:
              if j == 0:
                  pass
              else:
                  if i == prev:
                      hello = hello.replace(i, "")
                      prev = i
              prev = i
              j += 1
          return hello
      
      replacing()
      

      看起来有点原始,但我认为它有效,这就是我在旅途中想出的,希望它有所帮助:D

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多