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

0 投票
2 回答
1657 浏览
提问于 2025-04-17 23:27

我需要实现一个叫做 'remove_extra(lst)' 的函数,这个函数接收一个列表,然后返回一个去掉所有重复项的列表。注意:返回的列表中元素的顺序不重要。

提示:你可以使用排序或者其他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

我通常会使用 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
2

如果你需要直接修改 lst 这个列表,可以用完整的切片来赋值;使用 set() 可以生成一系列不重复的值,这样就不需要用循环了:

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

给切片赋值会替换列表中的 元素,而不是重新绑定 lst 这个名字。对于整个切片(从第一个元素到最后一个元素),这意味着我们用赋值右边的序列中的所有元素来替换列表中的所有元素。比如 lst[:] = set(lst) 就是把 lst 中的所有元素替换成同一个列表中的不重复元素。

不过,直接修改列表时最好不要返回同一个列表对象。这样做没什么意义,因为原来的列表已经被改变了;在 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

撰写回答