消除列表中的重复元素

荷马·孟

我在《 Think Python》一书中尝试了chp 10.15,并编写了以下代码:

def turn_str_to_list(string):
    res = []
    for letter in string:
        res.append(letter)
    return res

def sort_and_unique (t):
    t.sort()
    for i in range (0, len(t)-2, 1):
        for j in range (i+1, len(t)-1, 1):
            if t[i]==t[j]:
                del t[j]
    return t

line=raw_input('>>>')
t=turn_str_to_list(line)
print t
print sort_and_unique(t)

我使用了双重“ for”结构来消除排序列表中的所有重复元素。但是,当我运行它时,我一直得到错误的输出。如果我输入'committee',则输出为['c','e','i','m','o','t','t'],这是错误的,因为它仍然包含双精度't '。我尝试了不同的输入,有时该程序无法接收列表中间的重复字母,并且始终无法接收到末尾的字母。我想念什么?谢谢你们。

尼克特勒

您的程序之所以不能删除所有重复的字母,是因为del t[j]在嵌套的for循环中使用会导致程序跳过字母。

我添加了一些印刷品以帮助说明这一点:

def sort_and_unique (t):
    t.sort()
    for i in range (0, len(t)-2, 1):
        print "i: %d" % i
        print t
        for j in range (i+1, len(t)-1, 1):
            print "\t%d %s len(t):%d" % (j, t[j], len(t))
            if t[i]==t[j]:
                print "\tdeleting %c" % t[j]
                del t[j]
    return t

输出:

>>>committee
['c', 'o', 'm', 'm', 'i', 't', 't', 'e', 'e']
i: 0
['c', 'e', 'e', 'i', 'm', 'm', 'o', 't', 't']
        1 e len(t):9
        2 e len(t):9
        3 i len(t):9
        4 m len(t):9
        5 m len(t):9
        6 o len(t):9
        7 t len(t):9
i: 1
['c', 'e', 'e', 'i', 'm', 'm', 'o', 't', 't']
        2 e len(t):9
        deleting e
        3 m len(t):8
        4 m len(t):8
        5 o len(t):8
        6 t len(t):8
        7 t len(t):8
i: 2
['c', 'e', 'i', 'm', 'm', 'o', 't', 't']
        3 m len(t):8
        4 m len(t):8
        5 o len(t):8
        6 t len(t):8
i: 3
['c', 'e', 'i', 'm', 'm', 'o', 't', 't']
        4 m len(t):8
        deleting m
        5 t len(t):7
        6 t len(t):7
i: 4
['c', 'e', 'i', 'm', 'o', 't', 't']
        5 t len(t):7
i: 5
['c', 'e', 'i', 'm', 'o', 't', 't']
i: 6
['c', 'e', 'i', 'm', 'o', 't', 't']
['c', 'e', 'i', 'm', 'o', 't', 't']

无论何时del t[j]调用,列表都会变小一个元素,但内部j变量for循环会不断进行迭代。

例如:

i=1, j=2, t = ['c', 'e', 'e', 'i', 'm', 'm', 'o', 't', 't']

看到t [1] == t [2](均为'e'),因此将t [2]删除。

现在 t = ['c', 'e', 'i', 'm', 'm', 'o', 't', 't']

但是,代码以i=1继续j=3将'e'与'm'进行比较,并跳过'i'。

最后,它没有捕获最后两个't's,因为到time时i=5len(t)为7,因此内部for循环的条件range(6,6,1)已执行且未执行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章