鱼C论坛

 找回密码
 立即注册
查看: 1629|回复: 11

[已解决]python删除列表中的偶数

[复制链接]
发表于 2022-5-20 14:42:03 | 显示全部楼层 |阅读模式

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

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

x
a=[1,2,4,4,10,6,7,5,20]

for i in a:

    if i%2==0:
        a.remove(i)
print(a)

为什么删除不干净偶数呢?
大佬们帮帮忙。
最佳答案
2022-5-20 17:29:04
2022@lif 发表于 2022-5-20 17:23
能稍微解释一下吗,为什么这样子空间复杂度是为O(1)呢?这不应该还是O(n)嘛,我不太懂。




这里没有进行拷贝列表(拷贝列表就需要重新复制一便所有元素,即 n 个元素)

只命名了 1 个变量,没有进行递归堆栈,空间复杂度自然为 O(1) 常数级

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 14:44:23 | 显示全部楼层
不要在迭代循环中,做.remove(i) 的操作,当remove后,指针会动的,达不到你想要的效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-5-20 14:45:40 | 显示全部楼层

你在删除原列表,会导致所有后续元素索引 - 1

导致有些元素并没有被遍历到。你可以用 [:] 拷贝一份列表进行遍历,即可实现正常的删除效果

参考代码:
a=[1,2,4,4,10,6,7,5,20]

for i in a[:]:

    if i%2==0:
        a.remove(i)
print(a)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-5-20 14:46:43 | 显示全部楼层
a=[1,2,4,4,10,6,7,5,20]

for i in a[:]:

    if i%2==0:
        a.remove(i)
print(a)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-5-20 16:24:25 | 显示全部楼层
Twilight6 发表于 2022-5-20 14:45
你在删除原列表,会导致所有后续元素索引 - 1

导致有些元素并没有被遍历到。你可以用 [:] 拷贝一份列 ...

那现在代码的时间复杂性和空间复杂性都是O(n)吧,那怎么实现时间复杂性为O(n),空间复杂性为O(1)呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-20 16:40:23 | 显示全部楼层
2022@lif 发表于 2022-5-20 16:24
那现在代码的时间复杂性和空间复杂性都是O(n)吧,那怎么实现时间复杂性为O(n),空间复杂性为O(1)呢?

a=[1,2,4,4,10,6,7,5,20]
i = 0
while i < len(a):
    if a[i]%2==0:
        a.remove(a[i])
        continue
    i += 1
print(a)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-5-20 17:11:26 | 显示全部楼层
a=[1,2,4,4,10,6,7,5,20]
a = [i for i in a if i % 2 != 0]
print(a)
试试这个,运用列表推导式结合三目运算符一行代码搞定
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-5-20 17:23:42 | 显示全部楼层

能稍微解释一下吗,为什么这样子空间复杂度是为O(1)呢?这不应该还是O(n)嘛,我不太懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-20 17:29:04 | 显示全部楼层    本楼为最佳答案   
2022@lif 发表于 2022-5-20 17:23
能稍微解释一下吗,为什么这样子空间复杂度是为O(1)呢?这不应该还是O(n)嘛,我不太懂。




这里没有进行拷贝列表(拷贝列表就需要重新复制一便所有元素,即 n 个元素)

只命名了 1 个变量,没有进行递归堆栈,空间复杂度自然为 O(1) 常数级

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

使用道具 举报

发表于 2022-5-20 19:55:11 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-20 23:30:43 | 显示全部楼层
Twilight6 发表于 2022-5-20 17:29
这里没有进行拷贝列表(拷贝列表就需要重新复制一便所有元素,即 n 个元素)

只命名了 1 个变量 ...

谢谢大佬解疑。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-21 19:35:12 | 显示全部楼层
月下孤井 发表于 2022-5-20 17:11
a=[1,2,4,4,10,6,7,5,20]
a =
print(a)


我也来一个不一样的哈哈
a=[1,2,4,4,10,6,7,5,20]
b=list(filter(lambda i: i%2!=0 ,a))
print (b)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 05:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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