我正在尝试实现一个inplace算法来从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
你可以通过一套和一个理解来完成所有这些。无需复杂化。
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)))
在Python中就地修改字符串是不可能的,就像在Python中就地修改数字一样。
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
正如已经指出的那样,str
是不可改变的,因此就地要求毫无意义。如果你想获得所需的输出,我会按照以下方式进行:
str1 = 'geeksforgeeks'
out = ''.join([i for inx,i in enumerate(str1) if str1.index(i)==inx])
print(out) #prints: geksfor
在这里,我使用enumerate
函数得到数字(inx
)字母和.index
的str
方法的事实,返回元素的最低可能指数因此str1.index('e')
给定字符串是1
,而不是2
,而不是9
而不是10
。
这是unique_everseen
的itertools recipes
的简化版本。
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'