删除列表中的重复项并检查它是否与另一个列表相同

时间:2014-03-22 19:56:38

标签: python list

我的任务是实现'remove_extra(lst)',这样它就会接收一个列表并返回相同的列表,并删除所有重复的出现。注意:返回列表中元素的顺序无关紧要。 提示:您可以使用sort或任何其他python列表函数来使您的生活更轻松。

我得到了:

lst1 = [1, 5, 1, 1, 3]
lst2 = [2, 2, 2, 1, 5, 4, 4]
result1 = remove_extra(lst1)
result2 = remove_extra(lst2)

执行以下表达式时:

(result1 is lst1)
(result2 is lst2)

我的两个表达式都应该为True,但输出为False。 请帮我查一下我的代码:

def remove_extra(lst):
    new_lst = []
    for i in lst:
        if i not in new_lst:
        new_lst.append(i)

    return new_lst

2 个答案:

答案 0 :(得分:2)

如果您需要就地更改lst,请指定整个切片;使用set()生成一系列唯一值而不是循环:

def remove_extra(lst):
    lst[:] = set(lst)
    return lst

分配给切片会替换列表中的元素,而不是重新绑定名称lst。对于标识切片(从第一个元素到最后一个元素),这意味着我们用赋值右侧的序列中包含的任何元素替换所有元素。 lst[:] = set(lst)lst中的所有元素替换为同一列表中 set 中的元素。

但最好不要为就地操作返回相同的列表对象。没有什么意义,原来的名单已经改变了;当可变对象被直接更改时,Python内置类型总是返回None

演示:

>>> lst1 = [1, 5, 1, 1, 3]
>>> def remove_extra(lst):
...     lst[:] = set(lst)
...     return lst
... 
>>> lst1 = [1, 5, 1, 1, 3]
>>> result1 = remove_extra(lst1)
>>> result1 is lst1
True
>>> lst1
[1, 3, 5]
>>> lst2 = [2, 2, 2, 1, 5, 4, 4]
>>> result2 = remove_extra(lst2)
>>> result2 is lst2
True

答案 1 :(得分:0)

我通常会使用list(set(...))实施,但只是为了好玩,这里的方式不同:

L = [2, 2, 2, 1, 5, 4, 4]
L.sort()
i = 0
while i<len(L)-1:
    print("j:", j)
    while L[i]==L[j] and j<len(L):
        L.pop(j)
    i += 1