推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
omg21
V2EX  ›  Python

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

  •  
  •   omg21 · Oct 30, 2016 · 5137 views
    This topic created in 3665 days ago, the information mentioned may be changed or developed.
    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)就减少了,但循环的次数是不减的,所以到了后面就出错了。这样的情况应该怎么改?
    24 replies  •  2016-10-31 15:57:07 +08:00
    omg21
    omg21
    OP
    Oct 30, 2016
    1
    list1 = ['print','lock','china','page']
    for sub in list1:
    能不能在这里直接删除元素?
    wannafly
    wannafly
    Oct 30, 2016❤️1
    2
    正规(高效)的做法应该是在循环中把要删除的元素往前(后)交换, 并同时记录有效元素的最后(起始)索引, 循环结束了一次性删除待删除元素.
    cheneydog
    cheneydog
    Oct 30, 2016❤️1
    3
    你需要一个新的 list
    264768502
    264768502
    Oct 30, 2016 via Android❤️1
    4
    list1 = [x for x in list1 if 'a' not in x]
    billion
    billion
    Oct 30, 2016❤️3
    5
    楼主的代码有一股浓浓的 Java 的味道。
    Python 有更加现代化的写法。

    ![]( https://ooo.0o0.ooo/2016/10/30/5815caa3b24bd.png)
    billion
    billion
    Oct 30, 2016
    6
    https://ooo.0o0.ooo/2016/10/30/5815caa3b24bd.png

    图片又发不出来了吗?
    bingxx
    bingxx
    Oct 30, 2016
    7
    @billion groovy 也可以有优雅的写法。

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

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

    如果对内存比较敏感推荐用单向链表而不是 list 。
    luban
    luban
    Oct 30, 2016 via iPhone
    13
    上面说的对,用迭代器。
    java 里面使用 foreach 可以安全的 remove 元素
    luban
    luban
    Oct 30, 2016 via iPhone
    14
    java8 的流使用 filter 过滤出需要的元素也很方便的
    只会 java 路过
    forestyuan
    forestyuan
    Oct 30, 2016
    15
    正确的做法是从后往前删,就没有问题了。
    也就是, for(i = n-1; i >= 0; i --),而不是 for(i = 0; i < n; i ++)
    mooncakejs
    mooncakejs
    Oct 30, 2016
    16
    这种操作应该用 filter 而不是循环去删
    imn1
    imn1
    Oct 30, 2016
    17
    改变思维吧,循环过程中变更 list 长度是错误的思路
    1373569162
    1373569162
    Oct 30, 2016
    18
    @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)
    Dd47964IP97bP8H4
    Dd47964IP97bP8H4
    Oct 30, 2016
    19
    如果我没理解错的话。。。

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

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

    print(list2)
    # ['print', 'lock']
    ```
    Dd47964IP97bP8H4
    Dd47964IP97bP8H4
    Oct 30, 2016
    20
    或者更直观的

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

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

    print(list2)
    alittletrain
    alittletrain
    Oct 30, 2016
    21
    列表推导最 pythonic
    lrh3321
    lrh3321
    Oct 31, 2016
    22
    还可以使用内置 filter 函数

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

    list2 = filter(lambda item: 'a' not in item,list1)

    print(list2)
    billion
    billion
    Oct 31, 2016
    23
    @omg21 你的第二个需求

    如果你的 list1 里面至少有一个元素包含字母 a, 那么可以这样写:

    list2 = list1[list1.index([x for x in list1 if 'a' in x][0]) + 1 :]

    如果可能所以元素都不含 a,那么建议使用 for 循环。
    iyangyuan
    iyangyuan
    Oct 31, 2016
    24
    倒着来
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1034 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 22:48 · PVG 06:48 · LAX 14:48 · JFK 17:48
    ♥ Do have faith in what you're doing.