从字符串中删除重复的字符

JSW*_*189 38 python

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

foo = 'mppmt'
Run Code Online (Sandbox Code Playgroud)

我该如何制作字符串:

foo = 'mpt'
Run Code Online (Sandbox Code Playgroud)

注意:订单并不重要

Sve*_*ach 83

如果订单无关紧要,您可以使用

"".join(set(foo))
Run Code Online (Sandbox Code Playgroud)

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

如果为了的事情,你可以使用collections.OrderedDict在Python 2.7或以上:

from collections import OrderedDict
foo = "mppmt"
result = "".join(OrderedDict.fromkeys(foo))
Run Code Online (Sandbox Code Playgroud)

产生字符串"mpt".

  • +1:`fromkeys()`不经常使用,但你在这里使用得非常好. (2认同)

DSM*_*DSM 39

如果订单确实 重要,那么:

>>> foo = 'mppmt'
>>> ''.join(sorted(set(foo), key=foo.index))
'mpt'
Run Code Online (Sandbox Code Playgroud)

  • 简洁可读.不幸的是,它是O(n ^ 2). (8认同)
  • @DSM:通常,速度仅在字符串很长时才重要.不过,我必须纠正O(n ^ 2)分析.在Python 2.x中,无论字符串的长度如何,该集合最多只能包含256个元素.考虑到这一点,它是O(n).即使对于非常长的字符串,它也不会变得非常糟糕(尽管很容易构造出比"OrderedDict"方法慢8倍的情况). (5认同)
  • 真的够了.但它在五个字符的字符串上比OrderedDict.fromkeys快了近8倍.;-) <ducks> (2认同)

kev*_*kev 7

如果订单不是问题:

>>> foo='mppmt'
>>> ''.join(set(foo))
'pmt'
Run Code Online (Sandbox Code Playgroud)

保持订单:

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


Sou*_*tta 5

在 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))
Run Code Online (Sandbox Code Playgroud)

方法二:

s = "Protijayi"

aa = [ ch  for i, ch in enumerate(s) if ch not in s[:i]]
print(''.join(aa))
Run Code Online (Sandbox Code Playgroud)