1
omg21 OP list1 = ['print','lock','china','page']
for sub in list1: 能不能在这里直接删除元素? |
2
wannafly 2016-10-30 18:20:33 +08:00 1
正规(高效)的做法应该是在循环中把要删除的元素往前(后)交换, 并同时记录有效元素的最后(起始)索引, 循环结束了一次性删除待删除元素.
|
3
cheneydog 2016-10-30 18:20:57 +08:00 1
你需要一个新的 list
|
4
264768502 2016-10-30 18:21:07 +08:00 via Android 1
list1 = [x for x in list1 if 'a' not in x]
|
5
billion 2016-10-30 18:26:28 +08:00 3
楼主的代码有一股浓浓的 Java 的味道。
Python 有更加现代化的写法。 ![]( https://ooo.0o0.ooo/2016/10/30/5815caa3b24bd.png) |
6
billion 2016-10-30 18:27:55 +08:00
https://ooo.0o0.ooo/2016/10/30/5815caa3b24bd.png
图片又发不出来了吗? |
7
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) |
9
ferran 2016-10-30 18:48:46 +08:00 via Android
用迭代器遍历
|
11
omg21 OP @billion 没办法,以前 vb,java 用习惯了,一时半会儿改不过来。
再追加一个问题,如果 list1 = ['print','lock','china','g'],现在最后一个元素没有 a 了,我想在找到第一个有 a 的元素后不管后边的元素有没有 a 都保留下来,应该怎样做? |
13
luban 2016-10-30 19:20:21 +08:00 via iPhone
上面说的对,用迭代器。
java 里面使用 foreach 可以安全的 remove 元素 |
14
luban 2016-10-30 19:21:31 +08:00 via iPhone
java8 的流使用 filter 过滤出需要的元素也很方便的
只会 java 路过 |
15
forestyuan 2016-10-30 19:28:55 +08:00
正确的做法是从后往前删,就没有问题了。
也就是, for(i = n-1; i >= 0; i --),而不是 for(i = 0; i < n; i ++) |
16
mooncakejs 2016-10-30 19:30:44 +08:00
这种操作应该用 filter 而不是循环去删
|
17
imn1 2016-10-30 19:46:33 +08:00
改变思维吧,循环过程中变更 list 长度是错误的思路
|
18
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) |
19
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'] ``` |
20
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) |
21
alittletrain 2016-10-30 22:10:39 +08:00
列表推导最 pythonic
|
22
lrh3321 2016-10-31 11:12:44 +08:00
还可以使用内置 filter 函数
list1 = ['print', 'lock', 'china', 'page'] list2 = filter(lambda item: 'a' not in item,list1) print(list2) |
23
billion 2016-10-31 13:17:31 +08:00
@omg21 你的第二个需求
如果你的 list1 里面至少有一个元素包含字母 a, 那么可以这样写: list2 = list1[list1.index([x for x in list1 if 'a' in x][0]) + 1 :] 如果可能所以元素都不含 a,那么建议使用 for 循环。 |
24
iyangyuan 2016-10-31 15:57:07 +08:00
倒着来
|