菜鸡求教,为什么从切片删除数目不对

2017-09-07 14:56:53 +08:00
 wiZ90
书上习题写完了没事儿写着玩,问题在第 13 行开始,我想把 C = red 的都删除掉
为什么我的运行结果只剩下了一个?

alines = []
for alines_No in range (5):
new_aline = {"C":"red","Point":"10","Speed":"5"}
alines.append(new_aline)

for aline in alines:
print (aline)
print (len(alines))

for aline in alines[:2]:
if aline['C'] == 'red':
del alines[:2]
print (alines)


run

{'C': 'red', 'Point': '10', 'Speed': '5'}
{'C': 'red', 'Point': '10', 'Speed': '5'}
{'C': 'red', 'Point': '10', 'Speed': '5'}
{'C': 'red', 'Point': '10', 'Speed': '5'}
{'C': 'red', 'Point': '10', 'Speed': '5'}
5
[{'C': 'red', 'Point': '10', 'Speed': '5'}]
[Finished in 0.1s]
2692 次点击
所在节点    Python
13 条回复
nullcoder
2017-09-07 15:01:47 +08:00
我推测你是不是用了 jupyte notebook 然后 del 那个 cell 执行了两次
jmc891205
2017-09-07 15:03:44 +08:00
先不论这样写好坏
最后一个循环循环了两遍 每遍删除两个 最后不就应该只剩一个吗?
wiZ90
2017-09-07 15:04:05 +08:00
@nullcoder 好像没用。。但是我好想是明白了,我写的逻辑是 c=red 就删除两个切片
nullcoder
2017-09-07 15:04:42 +08:00
@jmc891205 正解,被排版坑了一眼
wiZ90
2017-09-07 15:05:43 +08:00
@jmc891205 是。。发完我有琢磨了一阵我就明白过来了。但是如何把前两个片删了。。。我再琢磨一会儿吧。。
wiZ90
2017-09-07 15:06:45 +08:00
@nullcoder 奇怪我后台排的是正确的
Daath
2017-09-07 15:16:18 +08:00
删除前两个?那你不是用 del xx[:2]就是删除了前两个了吗?然后你的代码这样遍历 list 然后再直接判断的去删掉 list 的一部分元素是有问题的。
awanabe
2017-09-07 15:32:02 +08:00
不要在迭代器中删除本身
ResidualSoils
2017-09-07 15:40:26 +08:00
不太懂 python,但是你可以反向循环一下试试。
nullcoder
2017-09-07 15:46:25 +08:00
初学推荐使用可以断点调试的 VS code IDE
fhefh
2017-09-07 20:40:27 +08:00
![]( )
Heron
2017-09-11 00:35:49 +08:00
这排版看的我累死了,不过确实是逻辑问题,循环两次,每次删除两个。最后剩下一个了。
goofool
2017-09-11 15:06:46 +08:00
在迭代器中删除列表的数据很危险

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

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

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

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

© 2021 V2EX