我实际上需要帮助评估我编写的代码的内容。
这意味着像这样运作:
input: remove_duple('WubbaLubbaDubDub')
output: 'WubaLubaDubDub'
另一个例子:
input: remove_duple('aabbccdd')
output: 'abcd'
我还是初学者,我想知道我的代码有什么问题以及更简单的方法。 (代码中有一些行是我努力想象正在发生的事情并调试它的一部分)
def remove_duple(string):
to_test = list(string)
print (to_test)
icount = 0
dcount = icount + 1
for char in to_test:
if to_test[icount] == to_test[dcount]:
del to_test[dcount]
print ('duplicate deleted')
print (to_test)
icount += 1
elif to_test[icount] != to_test[dcount]:
print ('no duplicated deleted')
print (to_test)
icount += 1
print ("".join(to_test))
答案 0 :(得分:0)
请勿修改您正在迭代的list
(例如del to_test[dcount]
)。你的迭代器会搞砸了。处理此问题的适当方法是创建一个只有您想要的值的新list
。
您的代码的修复程序可能如下所示:
In []:
def remove_duple(s):
new_list = []
for i in range(len(s)-1): # one less than length to avoid IndexError
if s[i] != s[i+1]:
new_list.append(s[i])
if s: # handle passing in an empty string
new_list.append(s[-1]) # need to add the last character
return "".join(new_list) # return it (print it outside the function)
remove_duple('WubbaLubbaDubDub')
Out[]:
WubaLubaDubDub
当你想逐步浏览字符串时,一次滑动2个字符,你可以简单地通过zip
将字符串本身移动一个来完成,如果2个字符不是,则添加第一个字符相等,例如:
In []:
import itertools as it
def remove_duple(s):
return ''.join(x for x, y in it.zip_longest(s, s[1:]) if x != y)
remove_duple('WubbaLubbaDubDub')
Out[]:
'WubaLubaDubDub'
In []:
remove_duple('aabbccdd')
Out[]:
'abcd'
注意:您需要itertools.zip_longest()
,否则您将删除最后一个字符。 fillvalue
的默认None
适用于字符串。