我正在查找如何创建一个函数,从python中的字符串中删除重复的字符,并在堆栈溢出时发现:
from collections import OrderedDict
def remove_duplicates (foo) :
print " ".join(OrderedDict.fromkeys(foo))
它有效,但如何?我已经搜索了OrderedDict和fromkeys的含义,但我无法找到解释它在这种情况下如何工作的任何内容。
答案 0 :(得分:11)
我会试一试:
OrderedDict是存储键的字典,以便添加它们。普通词典不适合。如果您查看fromkeys
的 doc ,就会发现:
OD.fromkeys(S [,v]) - >带有来自S的键的新有序字典。
因此,fromkeys
类方法使用输入可迭代S中的项(在我的示例中,字符串中的字符)作为键创建OrderedDict
。在字典中,键是唯一的,因此忽略S
中的重复项。
例如:
s = "abbcdece" # example string with duplicate characters
print(OrderedDict.fromkeys(s))
这导致OrderedDict:
OrderedDict([('a', None), ('b', None), ('c', None), ('d', None), ('e', None)])
然后" ".join(some_iterable)
采用iterable并在这种情况下使用空格连接其元素。它只使用键,因为字典的迭代是通过键来完成的。例如:
for k in OrderedDict.fromkeys(s): # k is a key of the OrderedDict
print(k)
结果:
a
b
c
d
e
随后,请致电加入:
print(" ".join(OrderedDict.fromkeys(s)))
将打印出来:
a b c d e
使用set
有时候,人们会使用一套:
print( " ".join(set(s)))
# c a b d e
但与C ++中的set不同,python中的set不保证顺序。因此,使用集合可以轻松地为您提供唯一值,但它们可能采用不同的顺序,然后它们位于原始列表或字符串中(如上例所示)。
希望这有点帮助。
答案 1 :(得分:1)
按列表理解
print ' '.join([character for index, character in enumerate(foo) if character not in foo[:index]])