鱼C论坛

 找回密码
 立即注册
查看: 2123|回复: 4

[已解决]在刷题 请问为什么 列表去重 为什么三没有被去除呢?

[复制链接]
发表于 2023-6-1 01:35:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下
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 = [int(x_lst[i]) for i in range(len(x_lst))]
print(remove_element_from_list(lista))

其他元素都被成功去除了 为何唯独三留下了
最佳答案
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 = [int(x_lst[i]) for i in range(len(x_lst))]
print(remove_duplicates_from_list(lista))

如果需要保持顺序,可以使用列表推导式:
def remove_duplicates_from_list(lista):
    return [lista[i] for i in range(len(lista)) if lista[i] not in lista[:i]]

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

以上两种方法都能有效地去重,并且不会出现在遍历时修改列表的问题。
列表去重出错3被保留.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-1 01:41:35 | 显示全部楼层
答案是新建一个列表 只要新列表里没有的元素就加进来 感觉简单明了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 = [int(x_lst[i]) for i in range(len(x_lst))]
print(remove_duplicates_from_list(lista))

如果需要保持顺序,可以使用列表推导式:
def remove_duplicates_from_list(lista):
    return [lista[i] for i in range(len(lista)) if lista[i] not in lista[:i]]

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

以上两种方法都能有效地去重,并且不会出现在遍历时修改列表的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 10:23:56 From FishC Mobile | 显示全部楼层
mumei2018 发表于 2023-6-1 01:41
答案是新建一个列表 只要新列表里没有的元素就加进来 感觉简单明了

set更简单
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-1 10:31:14 | 显示全部楼层

list(set())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 09:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表