可能重复:
How do you remove duplicates from a list whilst preserving order?
所以这个想法是程序采用一串字符并删除相同的字符 只出现任何重复字符的字符串 一次 - 删除任何重复的角色副本。 所以爱荷华州留下爱荷华州,但最终这个词最终将成为
答案 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)