V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
shierji
V2EX  ›  问与答

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

  •  
  •   shierji · 2015-08-27 10:13:25 +08:00 · 2344 次点击
    这是一个创建于 3377 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2015-08-27 11:03:23 +08:00
    现在的完整代码是这个:


    大家指出的问题其实我已经明白了,以前其实也看过只是写起来忘了= =
    可以通过逆向遍历来规避这个问题
    现在的问题是,我认为 for 循环不是只会取出元素一次么?操作以后就进入下一个了?
    那不管我有没有成功抓到结果是不是都到下一个了呢?
    22 条回复    2015-08-27 21:02:35 +08:00
    loading
        1
    loading  
       2015-08-27 10:16:12 +08:00 via Android   ❤️ 1
    不是你哪里写错了,试下加入 print 调试~
    shierji
        2
    shierji  
    OP
       2015-08-27 10:17:49 +08:00
    @loading 代码本身是没问题的,预期有些操作不会成功。现在的问题是希望操作不成功可以再来直到成功
    loading
        3
    loading  
       2015-08-27 10:21:10 +08:00 via Android
    请在每一句你的代码都写出 print 。不要过于自信。
    先写没有 if 的,看列表 print 全没!
    Kilerd
        4
    Kilerd  
       2015-08-27 10:21:28 +08:00 via Android
    @shierji 用 while 循环执行,直到成功为止,当然也可以失败 N
    Kilerd
        5
    Kilerd  
       2015-08-27 10:21:55 +08:00 via Android   ❤️ 1
    次后,跳出。


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

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

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

    现在的问题是,不管搜索是否成功这个关键词都会被跳过。不能确保取到所有词的结果。
    shierji
        10
    shierji  
    OP
       2015-08-27 10:36:23 +08:00
    @awanabe
    @hicdn 我确实是菜鸟。之前看过类似的问题但是忘了。。。
    我本身是化学老师- -
    这是给导师干活。。。
    aec4d
        11
    aec4d  
       2015-08-27 10:47:14 +08:00
    你可以试试这样用双端队列 取出一个如果失败再添加插入进去
    https://gist.github.com/anonymous/dd7e34a3a211c9cc9764
    hahastudio
        12
    hahastudio  
       2015-08-27 10:48:26 +08:00   ❤️ 1
    当你在 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
        13
    Sylv  
       2015-08-27 10:53:18 +08:00   ❤️ 1
    遍历列表时删除列表里的元素是会出问题的,要复制个新列表再遍历:

    for i in the_list[:]:
    if do_something_sucsess:
    remove_the_item_in_the_list
    else:
    do_something_else
    zhyu
        14
    zhyu  
       2015-08-27 11:04:35 +08:00   ❤️ 1
    不能一边遍历一边删。。你可以用 filter
    shierji
        15
    shierji  
    OP
       2015-08-27 11:08:59 +08:00
    @aec4d 感觉这个比较靠谱。我试试
    Sylv
        16
    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
        17
    virusdefender  
       2015-08-27 11:17:03 +08:00
    边遍历边删会出问题的 我遇到过
    shierji
        18
    shierji  
    OP
       2015-08-27 11:23:29 +08:00
    @Sylv 9 楼有解释。。反复的这样搞没意义。。我试试 11 楼的方案
    Sylv
        19
    Sylv  
       2015-08-27 11:40:17 +08:00   ❤️ 1
    @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
        20
    shierji  
    OP
       2015-08-27 11:41:52 +08:00
    @Sylv 明白了。你这样貌似更简单
    kxxoling
        21
    kxxoling  
       2015-08-27 14:57:20 +08:00
    刚刚在 StackOverflow 上看到同样的问题,那个也是楼主吗?
    shierji
        22
    shierji  
    OP
       2015-08-27 21:02:35 +08:00   ❤️ 1
    @kxxoling 对= =
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2745 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:18 · PVG 08:18 · LAX 16:18 · JFK 19:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.