zoukankan      html  css  js  c++  java
  • python list.remove(),del()和filter & lambda

    面试题之中的一个。

    下面代码能执行吗?

    l = [1,2,3,4,5]
    for i in range(0,len(l)):
        print i
        if l[i] % 2 == 0:
            del l[i]
    print l
    结果:
    Traceback (most recent call last):
      File "D:1.py", line 3, in <module>
        if l[i] % 2 == 0:
    IndexError: list index out of range

    啊。由于随着del()语句的执行。list的元素越来越少。可是for已经定了[0,5):

    i = 0,l[i] = 1不是偶数跳过

    i = 1。l[i] = 2是偶数。l = [1,3,4,5]

    i = 2,l[i] = 4是偶数。l=[1,3,5]

    i = 3,l[i] 越界了,list index out of range。

     



    下面代码能执行吗?

    ll = [1,2,3,4,5]
    for i in ll:
        if i % 2 == 0:
            ll.remove(i)
    
    print ll
    结果:

    >>> 
    [1, 3, 5]
    >>> 
    啊。这段代码就没上述的问题。list有多少就取多少。




    用filter()和lambda实现上面的功能:

    print filter(lambda e:e%2!=0,ll)
    结果:

    >>> 
    [1, 3, 5]
    >>> 
    啊,就这么简单。




    说下filter()吧:

    filter(function,list),把list中的元素一个个丢到function中。Return True的元素组成一个new list。

    ll = [1,2,3,4,5]
    def func(x):
        return x % 2 != 0
    
    print filter(func,ll)
    



    说下lambda吧:

    匿名函数,lambda a:b,当中a表示參数。b表示返回值。

    上面就是lambda e : e%2 != 0 。




    总结:

    1、循环list的时候,最好用for i in list:。降低由于del()放下不易察觉的失误。

    2、没事用用filter()和lambda,感觉挺装逼的。(这算什么总结嘛。)










  • 相关阅读:
    android listview去掉分割线
    svn 上传 过滤
    PPPOE 模拟环境搭建
    Android笔记之网络-基本了解
    ios多线程操作(五)—— GCD串行队列与并发队列
    UVa 679
    android中更改spinner、AutoCompleteTextView切割线的颜色
    Cocos2d-x中触摸事件
    全然符合package.json在CommonJS中的规范
    Hibernate实体对象继承策略
  • 原文地址:https://www.cnblogs.com/llguanli/p/8721573.html
Copyright © 2011-2022 走看看