重复数据删除算法逻辑

时间:2014-12-14 14:55:44

标签: python

你可以帮我找一下我逻辑中的错误吗?功能不能很好,我无法弄清楚原因。说明如下:编写一个函数remove_duplicates,它接受一个列表并删除列表中相同的元素。不要修改您输入的列表!而是返回一个新列表。例如:remove_duplicates([1,1,2,2])应返回[1,2]。

对于[1,2,2,5,5,5,7,7],我得到了这个输出[1,2,5,7],这很好。但是,对于[4,9,9,4],输出为[9,9,4],这是错误的。我无法找出问题所在。几个星期前我开始学习编程,所以我是新手。谢谢!

我的代码:

def remove_duplicates(l):
    nl = list(l)
    i = 0    
    while i <= len(nl)-2:
        j = i + 1
        while j <= len(nl)-1:
            if nl[i] == nl[j]:
                nl.remove(nl[j])
            else:
                j += 1
        i += 1
    return nl

5 个答案:

答案 0 :(得分:2)

您想要使用set。一组将删除重复

def remove_duplicates(l):
    return list(set(l))


l_1 = [1,1,2,2]
l_2 = remove_duplicates(l_1)

print l_1
print l_2

输出:

[1, 1, 2, 2]
[1, 2]

或者,使用您的其他列表:

[4, 9, 9, 4]
[9, 4]

请注意,该函数将set包裹在list中,否则您将获得set,而不是新的list

答案 1 :(得分:2)

在python中我们set删除重复:

>>> a = [1, 2, 2, 5, 5, 5, 7, 7]
>>> set(a)
set([1, 2, 5, 7])
如果您回溯,请在代码中

0 i          # here i is 0 
1 j          # here j is 0
4 duplicate element   first duplicate element found at last that is 4, but removed from front
1 i           # now list is [9,9,4]  but i is 1 and j is 2
2 j
[9, 9, 4]

因此9和9不匹配,因此未删除

所以在您的代码中,如果您放置del(nl[j]),它将正常工作。

答案 2 :(得分:0)

您可以通过将列表对象转换为set来查看重复数据删除。

my_list = [4, 9, 9, 4]
deduped = list(set(my_list))
print deduped  # prints [9, 4]

答案 3 :(得分:0)

你的主要问题是

nl.remove(nl[j])

您想删除索引j处的项目。这一行实际上做的是删除索引j中包含的第一次出现

相反,请尝试

del nl[j]

修改

让我们跟踪您的示例,remove_duplicates([4,9,9,4])

nl = [4, 9, 9, 4]
i = 0

j = 1
nl[0] != nl[1]

j = 2
nl[0] != nl[2]

j = 3
nl[0] == nl[3]

此时,你想通过调用

来摆脱nl[3]
nl.remove(nl[3])

但看看会发生什么:

>>> [4, 9, 9, 4].remove(4)      # you expect [4, 9, 9, {deleted}]
[9, 9, 4]                       # but get    [{deleted}, 9, 9, 4]

通过移动数组导致更多问题 - ij不再指向相同的项目。

原因很简单:

>>> help(list.remove)
L.remove(value) -> None -- remove first occurrence of value.
                                    ^^                 ^^

您告诉它删除,而不是位置

如果你做了

nl = [4, 9, 9, 4]
del nl[3]          # delete a *location*, not a *value*     
                   # gives [4, 9, 9, {deleted}]

你得到了你期待的结果。

答案 4 :(得分:0)

对于[4, 9, 9, 4],如果您希望[4, 9]成为输出,则仅使用list(set(a))的其他答案将无法保留订单。

保留订单使用:

def remove_duplicates(l):
    s = set()
    o = []
    for i in l:
        if i not in s:
            s.add(i)
            o.append(i)
    return o

看到:

>>> remove_duplicates([4, 9, 9, 4])
[4, 9]