python 如何保证列表中元素成功进行某操作

2015-08-27 10:13:25 +08:00
 shierji

现在是这样的
for i in the_list:
if do_something_sucsess:
remove_the_item_in_the_list
else:
do_something_else
现在的问题在于,即使这个操作不成功,这个元素也被跳过了(虽然它还在列表中)。如何能保证它一定被操作成功呢?
我想了很久一直没想明白

再及。。。 V2EX 怎么缩进啊- -

2359 次点击
所在节点    问与答
22 条回复
loading
2015-08-27 10:16:12 +08:00
不是你哪里写错了,试下加入 print 调试~
shierji
2015-08-27 10:17:49 +08:00
@loading 代码本身是没问题的,预期有些操作不会成功。现在的问题是希望操作不成功可以再来直到成功
loading
2015-08-27 10:21:10 +08:00
请在每一句你的代码都写出 print 。不要过于自信。
先写没有 if 的,看列表 print 全没!
Kilerd
2015-08-27 10:21:28 +08:00
@shierji 用 while 循环执行,直到成功为止,当然也可以失败 N
Kilerd
2015-08-27 10:21:55 +08:00
次后,跳出。


手机打就是麻烦了
loading
2015-08-27 10:23:02 +08:00
就你这点代码,真的没法帮…

因为我们写一个,绝对是跑全的~
hicdn
2015-08-27 10:29:43 +08:00
list 不能在遍历时删除元素
awanabe
2015-08-27 10:31:49 +08:00
@hicdn 楼主说代码绝对不会有问题的, 你就不要说出真相了... 他不懂迭代器的..
shierji
2015-08-27 10:34:17 +08:00
@Kilerd
@loading
https://gist.github.com/reee/2e81c4ff6754b785ea4a

现在是用关键词去 google 搜索,是自己搭的 google 镜像。因为 google 在搜索过多次以后会出验证码。
所以现在是如果这个关键词出的结果不对, scrape_keyword_count ()会返回 none 表示出错了。这个时候继续调之前那个地址去搜索是没意义的。需要从地址列表里面再取一个地址来进行搜索。

现在的问题是,不管搜索是否成功这个关键词都会被跳过。不能确保取到所有词的结果。
shierji
2015-08-27 10:36:23 +08:00
@awanabe
@hicdn 我确实是菜鸟。之前看过类似的问题但是忘了。。。
我本身是化学老师- -
这是给导师干活。。。
aec4d
2015-08-27 10:47:14 +08:00
你可以试试这样用双端队列 取出一个如果失败再添加插入进去
https://gist.github.com/anonymous/dd7e34a3a211c9cc9764
hahastudio
2015-08-27 10:48:26 +08:00
当你在 for 循环里修改这个 list 的时候,你总会把自己弄得一团糟
最简单的方法,用一个 deep copy 去循环

http://stackoverflow.com/questions/6022764/python-removing-list-element-while-iterating-over-list
http://stackoverflow.com/questions/5401601/problem-deleting-list-items-in-a-for-loop-python
Sylv
2015-08-27 10:53:18 +08:00
遍历列表时删除列表里的元素是会出问题的,要复制个新列表再遍历:

for i in the_list[:]:
if do_something_sucsess:
remove_the_item_in_the_list
else:
do_something_else
zhyu
2015-08-27 11:04:35 +08:00
不能一边遍历一边删。。你可以用 filter
shierji
2015-08-27 11:08:59 +08:00
@aec4d 感觉这个比较靠谱。我试试
Sylv
2015-08-27 11:17:02 +08:00
for 循环是只能取一次,如果我没有理解错你的问题的话,可以这样解决:

for i in the_list[:]:
... while not do_something_sucsess:
... ... do_something_else
... remove_the_item_in_the_list
virusdefender
2015-08-27 11:17:03 +08:00
边遍历边删会出问题的 我遇到过
shierji
2015-08-27 11:23:29 +08:00
@Sylv 9 楼有解释。。反复的这样搞没意义。。我试试 11 楼的方案
Sylv
2015-08-27 11:40:17 +08:00
@shierji 我没理解对?你不是要将搜索失败的关键字重新用新地址再搜一次直到成功吗? 11 楼的方法不就是关键词失败后再加到队列末尾排队到后再用新地址搜索一遍?我觉得是有点多此一举啦,失败了马上取新地址再搜直到成功就好啦,为什么还要再加到队列里去一遍呢?

for k in keywords_list[:]:
... url = get_google_add_url ()
... keyword_count = scrape_keyword_count (url )
... while not keyword_count:
... ... remove_bad_google_add ()
... ... url = get_another_google_add_url ()
... ... keyword_count = scrape_keyword_count (url )
... add_keyword_count (keyword_count )
... remove_keyword_from_list (k )
shierji
2015-08-27 11:41:52 +08:00
@Sylv 明白了。你这样貌似更简单

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

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

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

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

© 2021 V2EX