列表推导式去除字符串中字符重复
可能重复的问题:
如何在保留顺序的情况下从列表中删除重复项?
这个想法是程序接收一个字符的字符串,然后把里面重复的字符去掉,只保留每个字符出现一次。这样的话,像“Iowa”就还是“Iowa”,但“eventually”这个词就会变成“eventualy”。
8 个回答
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
这里有一个O(n)(平均情况下)的生成器表达式。其他的都是大约O(n2)。
chars = set()
string = "aaaaa"
newstring = ''.join(chars.add(char) or char for char in string if char not in chars)
之所以能这样工作,是因为set.add
返回的是None
,所以当字符不在set
里时,or
会让这个字符从生成器表达式中输出。
编辑:还可以看看refaim的解决方案。我的方案和他的第二个方案类似,但它使用set
的方式正好相反。
我对他OrderedDict
解决方案的看法:
''.join(OrderedDict((char, None) for char in word))
3
这里有一种效率不高的方法:
x = 'eventually'
newx = ''.join([c for i,c in enumerate(x) if c not in x[:i]])
我觉得在列表推导式中没有更高效的做法。