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,感觉挺装逼的。(这算什么总结嘛。)










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值