如何从字符串中删除重复的字符?

3
如何从字符串中删除所有重复的字符?
例如:
Input:  string = 'Hello'
Output: 'Heo'

这个问题与从字符串中移除重复字符的问题不同,因为我不想打印出重复的字符,而是想删除它们。


2
你的问题是否仅限于连续字符?或者你想让像“sports”这样的单词变成“port”吗? - normanius
实际上不是这样的:我正在尝试完全删除所有重复项,只留下仅重复一次的字符...在上面的帖子中,输出是一个集合:\ - EddyIT
如果你的问题被误解了,你可能需要重新写一下。可以加上更多的例子来让你的问题更清晰明了。那么下面的答案呢?在我看来,它们达到了你所要求的目标。 - normanius
确实如此。 - EddyIT
5个回答

7
您可以使用生成器表达式和 join 函数,例如:
>>> x = 'Hello'
>>> ''.join(c for c in x if x.count(c) == 1)
'Heo'

2
这是不必要的 O(n**2) - yatu
1
当然可以。但是用户并没有提出任何关于复杂性的问题。 - han solo
1
那又怎样?我看不出来这是不选择最有效答案的好理由。 - yatu
过早优化是万恶之源? :) 如果我担心时间复杂度,我会使用一个字典来实现。 - han solo
这个复杂度不是 O(n**2),最坏情况下是 O(nm) :) - han solo

5
您可以从字符串构建一个计数器,并且通过在计数器中查找仅出现一次的元素来检索它们:
from collections import Counter

c = Counter(string)
''.join([i for i in string if c[i]==1])
# 'Heo'

1
好的,知道了。谢谢 :) - han solo
没关系。我还是会留下复杂性警告,至少对于未来的访问者来说,当性能成为问题时,考虑这一点非常重要。@han - yatu
据我询问,join现在不会在内部创建一个list。请参见src。但是,我被告知这只是非常微小的优化。 - han solo
从我所理解的来看,它确实是这样,但可能有错。不过要注意你提出了这个问题 :) @han 我主要反对的是复杂度的差异。 - yatu
好的。我看到在其他地方也创建了list以进行连接。对此感到抱歉 :) - han solo
显示剩余2条评论

1
a = 'Hello'


list_a = list(a)

output = []
for i in list_a:
    if list_a.count(i) == 1:
        output.append(i)

''.join(output)

1
除了其他答案之外,还有一种可能的方法是使用 filter
s = 'Hello'
result = ''.join(filter(lambda c: s.count(c) == 1, s))
# result - Heo

1
如果您的问题仅限于仅有重复的连续字母情况(如您的示例所示),则可以使用正则表达式:
import re
print(re.sub(r"(.)\1+", "", "hello"))     # result = heo
print(re.sub(r"(.)\1+", "", "helloo"))    # result = he
print(re.sub(r"(.)\1+", "", "hellooo"))   # result = he
print(re.sub(r"(.)\1+", "", "sports"))    # result = sports

如果您需要多次应用正则表达式,最好事先编译它:
prog = re.compile(r"(.)\1+")
print(prog.sub("", "hello"))

为了限制在某些字符子集中搜索重复字母,您可以相应地调整正则表达式。

print(re.sub(r"(\S)\1+", "", "hello"))     # Search duplicated non-whitespace chars
print(re.sub(r"([a-z])\1+", "", "hello"))  # Search for duplicated lowercase letters

或者,使用列表推导的方法可以如下所示:

from itertools import groupby
dedup = lambda s: "".join([i for i, g in groupby(s) if len(list(g))==1])
print(dedup("hello"))     # result = heo
print(dedup("helloo"))    # result = he
print(dedup("hellooo"))   # result = he
print(dedup("sports"))    # result = sports

注意,使用正则表达式的第一种方法在我的电脑上比第二种方法快8-10倍。(系统:Python 3.6.7,MacBook Pro(2015年中期))


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