这个Python函数如何去除字符串中重复的字符?

13

我正在查找如何在Python中创建一个从字符串中删除重复字符的函数,并在stackoverflow上找到了以下内容:

我在stackoverflow上找到了一个函数,可以将给定字符串中的重复字符去除:

    from collections import OrderedDict

    def remove_duplicates (foo) :
        print " ".join(OrderedDict.fromkeys(foo))

它起作用了,但是它是怎么起作用的呢?我搜索过OrderedDict和fromkeys的含义,但是我找不到任何解释它们在这个上下文中是如何工作的。


3
请注意,这种方法不是非常快。 - John La Rooy
2个回答

13

我会尝试一下:

OrderedDict 是指以添加顺序来存储键的字典,而普通字典则不是这样。如果您查看 fromkeys文档,您会发现:

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)接受一个可迭代对象,并在这种情况下使用空格连接其元素。 它仅使用键,因为通过键迭代字典。 例如:

for k in OrderedDict.fromkeys(s): # k is a key of the OrderedDict
    print(k)

结果为:

a
b
c
d
e

随后,调用join方法:

print(" ".join(OrderedDict.fromkeys(s)))

将打印出:

a b c d e

使用set

有时候,人们会使用一个set来完成这个任务:

print( " ".join(set(s)))
# c a b d e

但是与C++中的set不同,Python中的set不保证顺序。因此,使用set可以轻松获得唯一值,但它们可能与原始列表或字符串中的顺序不同(如上例所示)。

希望这能有一点帮助。


1
通过列表推导式
print ' '.join([character for index, character in enumerate(foo) if character not in foo[:index]])

1
创建所有这些 foo[:index] 并不是非常高效的,更不用说使用 in 扫描每一个了。 - John La Rooy
1
你似乎完全没有理解问题...他想知道他的代码是如何工作的,他不需要也不想要替代方案。 - Xaver Kapeller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接