【问题标题】:Removing duplicate characters from a string从字符串中删除重复字符
【发布时间】:2012-04-08 03:17:33
【问题描述】:

如何使用 Python 从字符串中删除重复字符?例如,假设我有一个字符串:

foo = 'mppmt'

如何制作字符串:

foo = 'mpt'

注意:顺序并不重要

【问题讨论】:

  • @AljoshaBre - 使用“关闭”按钮并选择close as dupe 并提供该链接。谢谢
  • @AljoshaBre 这些答案都不能保证维持秩序。
  • 链接实际上已经存在。只需点击 4 次。

标签: python


【解决方案1】:

如果顺序无关紧要,你可以使用

"".join(set(foo))

set() 将在字符串中创建一组唯一的字母,"".join() 会将字母以任意顺序连接回字符串。

如果顺序确实很重要,您可以使用dict 而不是集合,因为 Python 3.7 保留了键的插入顺序。 (在 CPython 实现中,这已在 Python 3.6 中作为实现细节支持。)

foo = "mppmt"
result = "".join(dict.fromkeys(foo))

产生字符串"mpt"。在早期版本的 Python 中,您可以使用 collections.OrderedDict,它从 Python 2.7 开始提供。

【讨论】:

  • +1:fromkeys() 用得不多,但你在这里用得很好。
  • print "".join(OrderedDict.fromkeys(foo)) ^ SyntaxError: invalid syntax
  • @flik 是的,如前所述,上面的代码适用于 Python 2.7 版。
  • 这太棒了。非常感谢:D
【解决方案2】:

如果顺序确实很重要,那么:

>>> foo = 'mppmt'
>>> ''.join(sorted(set(foo), key=foo.index))
'mpt'

【讨论】:

  • 确实如此。但它比五字符字符串上的 OrderedDict.fromkeys 快了近 8 倍。 ;-)
  • @DSM:通常,只有字符串很长时,速度才重要。不过,我必须更正 O(n^2) 分析。在 Python 2.x 中,集合最多可以有 256 个元素,而不管字符串的长度。考虑到这一点,它是 O(n)。即使对于很长的字符串也不会变得非常糟糕(尽管很容易构建比OrderedDict 方法慢 8 倍的情况)。
  • @Sven Marnach:嗯,我还没想到字符集限制。
【解决方案3】:

如果顺序不是问题:

>>> foo='mppmt'
>>> ''.join(set(foo))
'pmt'

保持顺序:

>>> foo='mppmt'
>>> ''.join([j for i,j in enumerate(foo) if j not in foo[:i]])
'mpt'

【讨论】:

    【解决方案4】:

    在 Python 中创建一个列表以及一个不允许任何重复的集合。 解决方案1:

    def fix(string):
        s = set()
        list = []
        for ch in string:
            if ch not in s:
                s.add(ch)
                list.append(ch)
    
        return ''.join(list)        
    
    string = "Protiijaayiiii"
    print(fix(string))
    

    方法二:

    s = "Protijayi"
    
    aa = [ ch  for i, ch in enumerate(s) if ch not in s[:i]]
    print(''.join(aa))
    

    【讨论】:

      【解决方案5】:

      如前所述 "".join(set(foo)) 和 collections.OrderedDict 会做。 添加 foo = foo.lower() 以防字符串具有大小写字符,并且您需要删除所有重复项,无论它们是大写字符还是小写字符。

      from collections import OrderedDict
      foo = "EugeneEhGhsnaWW"
      foo = foo.lower()
      print "".join(OrderedDict.fromkeys(foo))
      

      打印eugnhsaw

      【讨论】:

        【解决方案6】:
        #Check code and apply in your Program:
        
        #Input= 'pppmm'    
        
        s = 'ppppmm'
        s = ''.join(set(s))  
        print(s)
        #Output: pm
        

        【讨论】:

        • 不确定您是否注意到它,但您的解决方案不适用于 OP 询问的情况。
        • @NikO'Lai,感谢您指出这一点。已更改代码。早期的代码是-pattern=reg.compile(r"(.)\1{1,}",reg.DOTALL) string=pattern.sub(r"\1",s) print(string)
        【解决方案7】:

        如果顺序很重要,

        seen = set()
        result = []
        for c in foo:
            if c not in seen:
                result.append(c)
                seen.add(c)
        result = ''.join(result)
        

        或者不使用集合:

        result = []
        for c in foo:
            if c not in result:
                result.append(c)
        result = ''.join(result)
        

        【讨论】:

        • @Marcin:我完全不明白。 c 不会一直在 set(foo) 中吗?
        • @Marcin 这将始终返回一个空字符串。 foo 中的每个 c 都在 set(foo) 中
        • @DSM / 凯文。还好我没有把它作为答案发布。 seen = set(); ''.join(seen.add(c) or c for c in foo if c not in seen)。这是一个隐式胜于显式的星期五。
        • 像result += c 这样构建一个字符串是非pythonic,因为它每次都会创建新字符串。
        • 不不不。不要对字符串执行result+=c。字符串是不可变的,您需要在添加每个字符时创建和销毁字符串。
        【解决方案8】:
        def dupe(str1):
            s=set(str1)
        
            return "".join(s)
        str1='geeksforgeeks'
        a=dupe(str1)
        print(a)
        

        如果顺序不重要,效果很好。

        【讨论】:

          【解决方案9】:
          d = {}
          s="YOUR_DESIRED_STRING"
          res=[]
          for c in s:
              if c not in d:
                res.append(c)
                d[c]=1
          print ("".join(res))
          

          变量 'c' 在 for 循环中遍历字符串 's' 并检查 c 是否在集合 d 中(最初没有元素),如果 c 不在 d 中,则将 c 附加到字符数组 ' res' 则集合 d 的索引 c 更改为 1。退出循环后,即 c 完成遍历字符串以将唯一元素存储在集合 d 中,打印具有所有唯一字符的结果 res。

          【讨论】:

          • 考虑包含对您的代码的描述以帮助其他人理解它。
          【解决方案10】:

          由于字符串是一个字符列表,将其转换为字典将删除所有重复项并保留顺序。

          "".join(list(dict.fromkeys(foo)))

          【讨论】:

          • 这只在python3.6+中是正确的
          【解决方案11】:

          函数式编程风格,同时保持秩序:

          import functools
          
          def get_unique_char(a, b):
              if b not in a:
                  return a + b
              else:
                  return a
          
          if __name__ == '__main__':
              foo = 'mppmt'
          
              gen = functools.reduce(get_unique_char, foo)
              print(''.join(list(gen)))
          

          【讨论】:

            【解决方案12】:
            def remove_duplicates(value):
                var=""
                for i in value:
                    if i in value:
                        if i in var:
                            pass
                        else:
                            var=var+i
                return var
            
            print(remove_duplicates("11223445566666ababzzz@@@123#*#*"))
            

            【讨论】:

            • 您可以随时编辑您的答案,而不是评论您自己的帖子。另外,请考虑在您的代码中添加任何解释。
            【解决方案13】:
            from collections import OrderedDict
            def remove_duplicates(value):
                    m=list(OrderedDict.fromkeys(value))
                    s=''
                    for i in m:
                        s+=i
                    return s
            print(remove_duplicates("11223445566666ababzzz@@@123#*#*"))
            
            

            【讨论】:

            【解决方案14】:
             mylist=["ABA", "CAA", "ADA"]
             results=[]
             for item in mylist:
                 buffer=[]
                 for char in item:
                     if char not in buffer:
                         buffer.append(char)
                 results.append("".join(buffer))
                
             print(results)
            
             output
             ABA
             CAA
             ADA
             ['AB', 'CA', 'AD']
            

            【讨论】:

              【解决方案15】:

              使用正则表达式:

              import re
              pattern = r'(.)\1+' # (.) any character repeated (\+) more than
              repl = r'\1'        # replace it once
              text = 'shhhhh!!!
              re.sub(pattern,repl,text)
              

              输出:

              sh!
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-02-20
                • 1970-01-01
                • 2020-03-30
                • 1970-01-01
                • 2013-11-22
                • 1970-01-01
                相关资源
                最近更新 更多