Python 3.xx - 从字符串中删除连续的数字/字母

时间:2017-08-21 04:05:34

标签: string python-3.x

我实际上需要帮助评估我编写的代码的内容。

这意味着像这样运作:

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))

1 个答案:

答案 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适用于字符串。