List Comprehension用于删除字符串中的重复字符

时间:2011-10-13 02:32:46

标签: python

  

可能重复:
  How do you remove duplicates from a list whilst preserving order?

所以这个想法是程序采用一串字符并删除相同的字符              只出现任何重复字符的字符串              一次 - 删除任何重复的角色副本。 所以爱荷华州留下爱荷华州,但最终这个词最终将成为

8 个答案:

答案 0 :(得分:3)

这里是 O(n)(平均情况)生成器表达式。其他都大致为O(n 2 )。

chars = set()
string = "aaaaa"
newstring = ''.join(chars.add(char) or char for char in string if char not in chars)

它起作用是因为set.add返回None,所以当or字符不在set中时,set将始终导致字符从生成器表达式中产生}。

编辑:另请参阅refaim的解决方案。我的解决方案就像他的第二个解决方案,但它以相反的方式使用OrderedDict

我对他的''.join(OrderedDict((char, None) for char in word)) 解决方案的看法:

{{1}}

答案 1 :(得分:2)

这是一种效率低下的方法:

x = 'eventually'
newx = ''.join([c for i,c in enumerate(x) if c not in x[:i]])

我认为在列表理解中没有一种有效的方法。

答案 2 :(得分:2)

没有列表理解:

from collections import OrderedDict

word = 'eventually'
print ''.join(OrderedDict(zip(word, range(len(word)))).keys())

使用列表推导(快速和肮脏的解决方案):

word = 'eventually'
uniq = set(word)
print ''.join(c for c in word if c in uniq and not uniq.discard(c))

答案 3 :(得分:1)

>>> s='eventually'
>>> "".join([c for i,c in enumerate(s) if i==s.find(c)])
'evntualy'

请注意,当您可以使用生成器表达式时,使用join()的列表推导是愚蠢的。你应该告诉老师更新他们的问题

答案 4 :(得分:0)

您可以从字符串中创建set,然后再将它们连接在一起。这是有效的,因为集合只能包含唯一值。 订单不会相同

In [1]: myString = "mississippi"

In [2]: set(myString))
Out[2]: set(['i', 'm', 'p', 's'])

In [3]: print "".join(set(myString))
Out[3]: ipsm

In [4]: set("iowa")
Out[4]: set(['a', 'i', 'o', 'w'])

In [5]: set("eventually")
Out[5]: set(['a', 'e', 'l', 'n', 't', 'u', 'v', 'y'])

编辑:刚看到标题中的“列表理解”,这可能不是你想要的。

答案 5 :(得分:0)

从原始字符串创建一个集合,然后按原始字符串中的字符位置排序:

>>> s='eventually'
>>> ''.join(sorted(set(s), key=s.index))
'evntualy'

答案 6 :(得分:0)

取自this question,我认为这是最快的方式:

>>> def remove_dupes(str):
...    chars = set()
...    chars_add = chars.add
...    return ''.join(c for c in str if c not in chars and not chars_add(c))
... 
>>> remove_dupes('hello')
'helo'
>>> remove_dupes('testing')
'tesing'

答案 7 :(得分:0)

word = "eventually"
evntualy = ''.join(
     c 
     for d in [dict(zip(word, word))] 
         for c in word 
     if d.pop(c, None) is not None)

重复agf的(聪明的)解决方案,但没有在生成器表达式之外进行设置:

evntualy = ''.join(s.add(c) or c for s in [set()] for c in word if c not in s)