【问题标题】:How to remove the first occurence of a repeated Character with python如何用python删除第一次出现的重复字符
【发布时间】:2021-11-09 22:29:49
【问题描述】:

我得到了以下字符串'abcdea',我需要找到重复的字符,但删除第一个字符,所以结果大多数是'bcdea' 我试图关注但只得到这个结果

def remove_rep(x):
    new_list = []
    for i in x:
        if i not in new_list:
            new_list.append(i)
    new_list = ''.join(new_list)
    print(new_list)

remove_rep('abcdea')

结果是'abcde' 不是我正在寻找的'bcdea'

【问题讨论】:

    标签: python python-3.x string


    【解决方案1】:

    你可以使用str.find(),它返回第一次出现的字符串:

    def remove_rep(oldString):
        newString = ''
        for i in oldString:
            if i in newString:
                # Character used previously, .find() returns the first position within string
                first_position_index = newString.find(i)
                newString = newString[:first_position_index] + newString[
                    first_position_index + 1:]
            newString += i
    
        print(newString)
    
    
    remove_rep('abcdea')
    remove_rep('abcdeaabcdea')
    

    输出:

    bcdea
    bcdea
    

    【讨论】:

    • abcdeaabcdea 的 o/p 不应该是 aabcdea 吗?因为我们只需要删除第一次出现的字符并保留其余的
    • 问题描述是这样说的:如何用python删除重复字符的“第一次出现”
    【解决方案2】:

    一种方法可以是在字符串上以相反的顺序迭代,并跟踪字符串中看到的所有字符。如果某个字符重复,我们不会将其添加到new_list

    def remove_rep(x: str):
        new_list = []
        seen = set()
    
        for char in reversed(x):
            if char not in seen:
                new_list.append(char)
            seen.add(char)
    
        return ''.join(reversed(new_list))
    
    print(remove_rep('abcdea'))
    

    结果:'bcdea'


    请注意,上述解决方案并不能完全按预期工作,因为它会删除除最后一个字符之外的所有字符;例如,如果您有 2 次以上的字符出现并且您只想删除第一个字符。要解决此问题,您可以改为执行以下操作:

    def remove_rep(x: str):
        new_list = []
        first_seen = set()
    
        for char in x:
            freq = x.count(char)
            if char in first_seen or freq == 1:
                new_list.append(char)
            elif freq > 1:
                first_seen.add(char)
    
        return ''.join(new_list)
    
    

    现在对于给定的输入:

    print(remove_rep('abcdeaca'))
    

    我们得到了想要的结果 - 只有第一个 ac 被删除:

    bdeaca
    

    测试更复杂的输入:

    print(remove_rep('abcdeaabcdea'))
    

    我们确实得到了正确的结果:

    aabcdea
    

    你看到最后一个发生了什么吗?第一个abcde 序列被删除,因为所有字符都在此字符串中重复。所以我们的结果实际上是正确的,尽管乍一看并不那么正确。

    【讨论】:

      【解决方案3】:

      if 条件有一点小变化的方法之一:

      def remove_rep(x):
          new_list = []
          visited = []
          for i, item in enumerate(x):
              if item not in x[i+1:] or item in visited:
                  new_list.append(item)
              else:
                  visited.append(item)
          new_list = ''.join(new_list)
          print(new_list)
      
      remove_rep('abcdeaa')
      remove_rep('abcdeaabcdea')
      

      输出:

      bcdeaa
      aabcdea
      

      【讨论】:

        【解决方案4】:

        str.replace() 这样做:

        https://docs.python.org/3/library/stdtypes.html#str.replace

        str.replace(old, new[, count])

        返回所有出现的子字符串 old 的字符串副本 换成新的。如果给出了可选参数计数,则只有 第一次出现的次数被替换。

        所以基本上:

        "abcabc".replace('b', '', 1)
        # output : 'acabc'
        

        【讨论】:

          【解决方案5】:

          改变

          new_list = ''.join(new_list)
          

          new_list = ''.join(new_list[1:]+[i])
          

          (找出原因!提示:if 块的条件是什么?你在检查什么以及为什么?)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-14
            • 2022-11-22
            • 2013-12-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多