list 删除元素后,怎样减循环次数?

2016-10-30 18:11:56 +08:00
 omg21
list1 = ['print','lock','china','page']
print(len(list1))
print(list1)
for i in range(0,len(list1)):
if list1[i].find('a') != -1:
list1.pop(i)

这段代码的本意是查找列表中各元素里有没有字母 a ,如果有 a 就删除这个元素,可是现在发现个问题,删除了以后 len(list1)就减少了,但循环的次数是不减的,所以到了后面就出错了。这样的情况应该怎么改?
3704 次点击
所在节点    Python
24 条回复
omg21
2016-10-30 18:20:08 +08:00
list1 = ['print','lock','china','page']
for sub in list1:
能不能在这里直接删除元素?
wannafly
2016-10-30 18:20:33 +08:00
正规(高效)的做法应该是在循环中把要删除的元素往前(后)交换, 并同时记录有效元素的最后(起始)索引, 循环结束了一次性删除待删除元素.
cheneydog
2016-10-30 18:20:57 +08:00
你需要一个新的 list
264768502
2016-10-30 18:21:07 +08:00
list1 = [x for x in list1 if 'a' not in x]
billion
2016-10-30 18:26:28 +08:00
楼主的代码有一股浓浓的 Java 的味道。
Python 有更加现代化的写法。

![]( https://ooo.0o0.ooo/2016/10/30/5815caa3b24bd.png)
billion
2016-10-30 18:27:55 +08:00
https://ooo.0o0.ooo/2016/10/30/5815caa3b24bd.png

图片又发不出来了吗?
bingxx
2016-10-30 18:40:52 +08:00
@billion groovy 也可以有优雅的写法。

def list1 = ['print','lock','china','page']
def list2 = list1.findAll{it?.contains("a")}
println(list2)
omg21
2016-10-30 18:46:01 +08:00
ferran
2016-10-30 18:48:46 +08:00
用迭代器遍历
Mandown
2016-10-30 18:53:23 +08:00
@billion 回复貌似不资词 markdown
omg21
2016-10-30 18:55:30 +08:00
@billion 没办法,以前 vb,java 用习惯了,一时半会儿改不过来。
再追加一个问题,如果 list1 = ['print','lock','china','g'],现在最后一个元素没有 a 了,我想在找到第一个有 a 的元素后不管后边的元素有没有 a 都保留下来,应该怎样做?
liuxingou
2016-10-30 19:17:15 +08:00
@omg21

VB 用习惯是一个比较坑的情景。。。

如果对内存比较敏感推荐用单向链表而不是 list 。
luban
2016-10-30 19:20:21 +08:00
上面说的对,用迭代器。
java 里面使用 foreach 可以安全的 remove 元素
luban
2016-10-30 19:21:31 +08:00
java8 的流使用 filter 过滤出需要的元素也很方便的
只会 java 路过
forestyuan
2016-10-30 19:28:55 +08:00
正确的做法是从后往前删,就没有问题了。
也就是, for(i = n-1; i >= 0; i --),而不是 for(i = 0; i < n; i ++)
mooncakejs
2016-10-30 19:30:44 +08:00
这种操作应该用 filter 而不是循环去删
imn1
2016-10-30 19:46:33 +08:00
改变思维吧,循环过程中变更 list 长度是错误的思路
1373569162
2016-10-30 19:56:13 +08:00
@omg21
1
2 def f(n, l):
3 for x in l:
4 if n in x:
5 return l[l.index(x):]


list1 = ['print', 'lock', 'china', 'g']
list2 = f('a', list1)
speedcell4
2016-10-30 20:24:20 +08:00
如果我没理解错的话。。。

```python
list1 = ['print', 'lock', 'china', 'page']

list2 = [item for item in list1 if item.count('a') == 0]

print(list2)
# ['print', 'lock']
```
speedcell4
2016-10-30 20:25:20 +08:00
或者更直观的

list1 = ['print', 'lock', 'china', 'page']

list2 = [item for item in list1 if 'a' not in item]

print(list2)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/316607

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX