2022@lif 发表于 2022-5-20 14:42:03

python删除列表中的偶数

a=

for i in a:

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

为什么删除不干净偶数呢?
大佬们帮帮忙。

wp231957 发表于 2022-5-20 14:44:23

不要在迭代循环中,做.remove(i) 的操作,当remove后,指针会动的,达不到你想要的效果

Twilight6 发表于 2022-5-20 14:45:40


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

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

参考代码:


a=

for i in a[:]:

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

wp231957 发表于 2022-5-20 14:46:43

a=

for i in a[:]:

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

2022@lif 发表于 2022-5-20 16:24:25

Twilight6 发表于 2022-5-20 14:45
你在删除原列表,会导致所有后续元素索引 - 1

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

那现在代码的时间复杂性和空间复杂性都是O(n)吧,那怎么实现时间复杂性为O(n),空间复杂性为O(1)呢?

Twilight6 发表于 2022-5-20 16:40:23

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


a=
i = 0
while i < len(a):
    if a%2==0:
      a.remove(a)
      continue
    i += 1
print(a)

月下孤井 发表于 2022-5-20 17:11:26

a=
a =
print(a)
试试这个,运用列表推导式结合三目运算符一行代码搞定

2022@lif 发表于 2022-5-20 17:23:42

Twilight6 发表于 2022-5-20 16:40


能稍微解释一下吗{:10_297:},为什么这样子空间复杂度是为O(1)呢?这不应该还是O(n)嘛,我不太懂。

Twilight6 发表于 2022-5-20 17:29:04

2022@lif 发表于 2022-5-20 17:23
能稍微解释一下吗,为什么这样子空间复杂度是为O(1)呢?这不应该还是O(n)嘛,我不太懂。



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

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

白two 发表于 2022-5-20 19:55:11

Twilight6 发表于 2022-5-20 16:40


学到了, 太强了

2022@lif 发表于 2022-5-20 23:30:43

Twilight6 发表于 2022-5-20 17:29
这里没有进行拷贝列表(拷贝列表就需要重新复制一便所有元素,即 n 个元素)

只命名了 1 个变量 ...

谢谢大佬解疑。

xfmiao 发表于 2022-5-21 19:35:12

月下孤井 发表于 2022-5-20 17:11
a=
a =
print(a)



我也来一个不一样的哈哈
a=
b=list(filter(lambda i: i%2!=0 ,a))
print (b)
页: [1]
查看完整版本: python删除列表中的偶数