如何在Python中从字符串中就地删除重复项?

时间:2019-03-03 05:06:04

标签: python string duplicates conditional-statements index-error

我正在尝试实现就地算法以从Python中的字符串中删除重复项。

str1 = "geeksforgeeks"
for i in range(len(str1)):
    for j in range(i+1,len(str1)-1):
         if str1[i] == str1[j]:  //Error Line
                      str1 = str1[0:j]+""+str1[j+1:]



print str1

在上面的代码中,我试图用空格替换重复的字符。但是我在IndexError: string index out of range得到了if str1[i] == str1[j]。我错过了什么吗?还是不正确的方法?

我的预期输出是:geksfor

4 个答案:

答案 0 :(得分:1)

您只需设置一组内容就可以完成所有这些工作。无需使事情复杂化。

str1 = "geeksforgeeks"

seen = set()
seen_add = seen.add
print(''.join(s for s in str1 if not (s in seen or seen_add(s))))
#geksfor
  

“简单胜于复杂。”

     

〜参见PEP20

修改

尽管以上内容比您的答案更简单,但这是removing duplicates from a collection的最有效方式,更简单的解决方案是使用:

from collections import OrderedDict
print("".join(OrderedDict.fromkeys(str1)))

答案 1 :(得分:0)

无法在Python中就地修改字符串,就像无法在Python中就地修改 numbers 一样。

a = "something"
b = 3

b += 1        # allocates a new integer, 4, and assigns it to b
a += " else"  # allocates a new string, " else", concatenates it to `a` to produce "something else"
              # then assigns it to a

答案 2 :(得分:0)

正如已经指出的,str是不可变的,因此就地的 要求没有任何意义。 如果要获得所需的输出,我可以按照以下方式进行:

str1 = 'geeksforgeeks'
out = ''.join([i for inx,i in enumerate(str1) if str1.index(i)==inx])
print(out) #prints: geksfor

在这里,我使用了enumerate函数来获取数字(inx)字母,并且事实是.index的{​​{1}}方法返回了元素的最低索引,因此{{1}给定字符串的}是str,不是str1.index('e'),不是1也不是2

答案 3 :(得分:0)

这是itertools recipesunique_everseen的简化版本。

from itertools import filterfalse

def unique_everseen(iterable)
    seen = set()
    see _ add = seen.add
    for element in filterfalse(seen.__contains__, iterable):
        seen_add(element)
        yield element

然后可以将此生成器与str.join结合使用以获取预期的输出。

str1 = "geeksforgeeks"
new_str1 = ''.join(unique_everseen(str1)) # 'geksfor'