python-cookbook学习笔记四

过滤序列元素:
有一个序列,想从其中过滤出想要的元素。最常用的办法就是列表过滤:比如下面的形式:这个表达式的意义是从1000个随机数中选出大于400的数据
test=[]

for i in range(1000):

    test.append(random.randint(1,1000))

ret=[n for n in test if n >400]
根据cookbook书上的描述,这个方法适用于小数据的方式。如果数据集非常的大,而且要考虑内存的话建议使用生成器的方式ret=(n for n in test if n >400)
 
def filter_data(n):

    start=time.time()

    test=[]

    for i in range(n):

        test.append(random.randint(1,n))

    ret=[n for n in test if n >400]

    end=time.time()

    print 'Time using list iterater is %s' % (end-start)

    start=time.time()

    test=[]

    for i in range(n):

        test.append(random.randint(1,n))

    ret=(n for n in test if n >400)

    end=time.time()

    print 'Time using generater is %s' % (end-start)
我们先看下n=1000的运行结果:

filter_data(1000) 时间都差不多,看不出差别



N=10000的运行结果 用生成器要少于列表过滤的方法
filter_data(10000)


N=100000的运行结果 差距进一步拉大
filter_data(100000)


可以看出随着数据的扩大,确实生成器更能节省时间。
 
如果我们有两个列表,一个是存储信息的,一个是存储该信息的特征值的时候。我们想吧满足某种特征值的信息提取出来该如何操作呢。这里有个过滤工具itertools.compress
假设我们有下列数据,address存放的是具体的地址信息,count值对应的是各个地址信息的特征值。两者的索引是一一对应
    addresses = [

'5412 N CLARK',

'5148 N CLARK',

'5800 E 58TH',

'2122 N CLARK'

'5645 N RAVENSWOOD',

'1060 W ADDISON',

'4801 N BROADWAY',

'1039 W GRANVILLE',

]

    counts=[0,3,10,4,1,7,6,1]
 
如果我们想把特征值大于5的地址信息提取出来。其实方法也比较简单,如下是没有依赖任何模块的写法,也就是通过两个列表一一判断。
for i in range(len(addresses)):

    if counts[i] >= 5:

        tmp.append(addresses[i])

print tmp
 
compress的用法如下:首先生成一个feature的列表,这个feature列表根据生成式生成一个满足条件的过滤表。然后调用compress,第一个参数是原始数据,第二个参数是过滤条件。
feature=[n>=5 for n in counts]

print feature

print list(compress(addresses,feature))
两种方法比较,如果过滤条件已经具备,那么使用compress更方便一些。否则从我个人感觉来看没有什么差别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿与代码

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值