Python 推导式
推导式(解析式)
推导式comprehensions(又称解析式),是Python的一种独有特性。
推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导,在Python2和3中都有支持:
- 列表(list)推导式
- 字典(dict)推导式
- 集合(set)推导式
range() 函数
python的 range() 函数可用来创建一个整数列表,一般用在 for 循环中.
range()语法:
range(start, stop[, step])
start: 计数从start开始,默认是从0开始(闭区间),如:range(5)等价于range(0,5).
stop: 计数到stop结束,但不包括stop(开区间).如:range(0,5)是[0, 1, 2, 3, 4],不包含5.
step: 步长,相邻两个值的差值,默认为1.如:range(0,5)相当于range(0, 5, 1).
列表推导式是通过一个可迭代对象来生成列表的, range()可以说是列表推导式中最常用的可迭代对象了.对列表推导式来说, range() 是其中的精髓之一.
列表推导式
基本格式为:
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]
具体可分为两种:
[x for x in data if condition]
此处if主要起条件判断作用,data数据中只有满足if条件的才会被留下,最后统一生成为一个数据列表。
[exp1 if condition else exp2 for x in data]
此处if…else主要起赋值作用,当data中的数据满足if条件时将其做exp1处理,否则按照exp2处理,最后统一生成为一个数据列表。
例1:过滤掉长度小于或等于3的字符串列表,并将剩下的转换成大写字母:
1 | 'Bob','Tom','alice','Jerry','Wendy','Smith'] names = [ |
例2:生成间隔5分钟的时间列表序列:
1 | '%.2d:%.2d'%(h,m )for h in range(24) for m in range(0,60,5) ] time = [ |
例3: 求(x,y),其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表:
1 | >>>list = [(x,y) for x in range(5) if x%2 == 0 for y in range(5) if y%2 == 1] |
例4: 求M中斜线1,5,9组成的列表:
1 | >>>M = [[1,2,3],[4,5,6],[7,8,9]] |
注意:
使用()生成generator:
将俩表推导式的[]改成()即可得到生成器。
1
2
3
4 multiples = (i for i in range(30) if i % 3 is 0)
print(type(multiples))
Output: <type 'generator'>
字典推导式
基本格式为:
{ key:value for key, value in existing_data_structure }
这里和list有所不同,因位dict里面有两个关键的属性,key 和 value,但大同小异,我们现在的expression部分可以同时对 key 和 value 进行操作 :
例1: 用字典推导式配合枚举的使用案例:
1 | 'import','is','with','if','file','exception','shim','lucy'] strings = [ |
上题的k是字符串,v是序列。如果我们更换k v:
1 | 'import','is','with','if','file','exception','shim','lucy'] strings = [ |
其中,enumerate()函数参考:https://www.runoob.com/python/python-func-enumerate.html
例2:源数据的key是字母的大小写混在一起,我们想统计同一个字母(不论大小写)的key所对应的键值对的和:
1 | nums = {'a':10,'b':20,'A':5,'B':3,'d':4} |
集合推导式
基础格式为:
{ expression for item in Sequence if conditional }
其实集合推导式和list的推导式很像,但是既然是集合,肯定会配合利用Set的特有属性来实现我们的目的。
例1:首先,我们来看一个根据Set值唯一的特性的例子,我们有一个list叫names,用来存储名字,其中的数据很不规范,有大写,小写,还有重复的,我们想要去重并把名字的格式统一为首字母大写,实现方法便是用Set推导式:
1 | 'Bob', 'JOHN', 'alice', 'bob', 'ALICE', 'James', 'Bob','JAMES','jAMeS' ] names = [ |
拓展阅读
[1] Python Tutorial: Comprehensions
[2] Python常用的推导式