mumei2018 发表于 2023-6-1 01:35:52

在刷题 请问为什么 列表去重 为什么三没有被去除呢?

代码如下
def remove_element_from_list(lista):
    for item in lista:#遍历每个元素
      count = lista.count(item)#计算元素出现次数
      if count > 1:
            lista.remove(item)#发现出现次数大于1则删除该元素
    return lista

x = input()
x_lst = x.split(',')
lista = ) for i in range(len(x_lst))]
print(remove_element_from_list(lista))

其他元素都被成功去除了 为何唯独三留下了

mumei2018 发表于 2023-6-1 01:41:35

答案是新建一个列表 只要新列表里没有的元素就加进来 感觉简单明了

isdkz 发表于 2023-6-1 01:41:49

本帖最后由 isdkz 于 2023-6-1 01:43 编辑

在 Python 中,不建议在遍历列表的同时对其进行修改(如删除操作)。因为这可能会影响遍历的过程,可能导致遍历的索引与实际的元素不匹配,从而出现一些奇怪的行为,就像你看到的 "3" 没有被删除的情况。

原因是:当你删除一个元素时,列表中所有后面的元素的索引都会相应地减少 1。然而,循环的下一次迭代仍然会增加索引,结果就是可能会跳过一个元素。在你的例子中,如果有两个相同的元素连续出现,你可能会删除第一个,但跳过第二个,因为第二个元素在删除第一个元素后移动到了第一个元素的位置。

要解决这个问题,一种更好的方法是使用集合(set)来去重,因为集合中的元素都是唯一的。不过需要注意的是,这种方法会丢失原列表的顺序,如果你需要保持元素的顺序,可以使用有序集合(OrderedDict)或者列表推导式。

下面是一个使用 set 来去重的例子:

def remove_duplicates_from_list(lista):
    return list(set(lista))

x = input()
x_lst = x.split(',')
lista = ) for i in range(len(x_lst))]
print(remove_duplicates_from_list(lista))


如果需要保持顺序,可以使用列表推导式:

def remove_duplicates_from_list(lista):
    return for i in range(len(lista)) if lista not in lista[:i]]

x = input()
x_lst = x.split(',')
lista = ) for i in range(len(x_lst))]
print(remove_duplicates_from_list(lista))


以上两种方法都能有效地去重,并且不会出现在遍历时修改列表的问题。

wp231957 发表于 2023-6-1 10:23:56

mumei2018 发表于 2023-6-1 01:41
答案是新建一个列表 只要新列表里没有的元素就加进来 感觉简单明了

set更简单

歌者文明清理员 发表于 2023-6-1 10:31:14

wp231957 发表于 2023-6-1 10:23
set更简单

list(set())
页: [1]
查看完整版本: 在刷题 请问为什么 列表去重 为什么三没有被去除呢?