一.列表,字典,集合的筛选
列表 的筛选
列表的筛选 有两种:1. filter #通过列表解析随机推导定义一个列表 In [2]: data =[randint(-10,10) for _ in xrange(10)] In [3]: data Out[3]: [10, -1, -3, 10, -7, -10, -9, 8, -9, 7] #通过filter函数筛选 (其实可以去看看filter源码咋实现的) In [4]: filter(lambda x: x>0 ,data) Out[4]: [10, 10, 8, 7] 2. 列表解析推导 In [6]: [x for x in data if x>=0] Out[6]: [10, 10, 8, 7] 突然想知道两种方式 哪种更优呢? In [7]: timeit filter(lambda x:x>=0 ,data) 1000000 loops, best of 3: **1.39 µs** per loop In [8]: timeit [x for x in data if x>=0] 1000000 loops, best of 3: **545 ns** per loop **发现列表解析通常比filter 更快**
字典的筛选
随机生成一个集合。
In [9]: {x: randint(60,100) for x in xrange(1,21)}
通过列表解析 键值对 来筛选 (比较简单)
In [15]: {k:v for k,v in d.iteritems() if v>90}
Out[15]: {3: 95, 10: 97, 15: 96}集合的筛选
继续用刚才的data给他转成集合:
In [16]: s= set(data)
In [17]: s
Out[17]: {-10, -9, -7, -3, -1, 7, 8, 10}
就用集合解析好了:
In [18]: {x for x in s if x>=0}
Out[18]: {7, 8, 10}
跟列表解析差不多 类似, 和字典解析的区别在于,字段多一个: ,多一个键值对的概念
二.为元组每个元素命名,提高程序的可持续发展~
1. 通过枚举的方式定义变量
#!/bin/python
#-*- coding: UTF-8 -*-
#name = 0
#sex = 1
#age = 2
#location= 3
#email = 4
name,sex,age,location,email = xrange(5)
Student=('Gil','Male','28','zhejiang','woshigezhipeng@sina.com')
print Student[name]
print Student[sex]
print Student[age]
print Student[location]
print Student[email]
2. 通过标准库 collection.namedtuple
In [2]: from collections import namedtuple
#通过namedtuple定义一个student类
In [4]: student =namedtuple('student'['name','sex','age','location','email'])
#定义一个student对象,并赋值
In [5]: s=student('gil','male','28','zhejiang','woshigezhipeng@sina.com')
In [7]: s.name
Out[7]: 'gil'