推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据结构构建另一个新的数据结构的结构体。 共有三种推导,在Python2和3中都有支持:
- 列表(list)推导式
- 字典(dict)推导式
- 集合(set)推导式
一.列表推导式
说明:列表推导式是用可迭代对象依次生成带有多个元素的列表的表达式
作用:用简易的方法生成一个新的列表
基本语法为:
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]
具体可分为两种:
1. [x for x in data if condition]
此处if主要起条件判断作用,data数据中只有满足if条件的才会被留下,最后统一生成为一个数据列表。
2. [exp1 if condition else exp2 for x in data]
此处if...else主要起赋值作用,当data中的数据满足if条件时将其做exp1处理,否则按照exp2处理,最后统一生成为一个数据列表
为了加深理解我们举个例子:
variable = [out_exp_res for out_exp in input_list if out_exp == 2] out_exp_res: #列表生成元素表达式,可以是有返回值的函数 for out_exp in input_list: #迭代input_list将out_exp传入out_exp_res表达式中 if out_exp == 2: #根据条件过滤哪些值可以
我们可以再举几个例子:
multiples = [i for i in range(30) if i % 3 == 0] print(multiples) Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
multiples = [squared(i) for i in range(30) if i % 3 == 0] print multiples Output: [0, 9, 36, 81, 144, 225, 324, 441, 576, 729]
data = ['driver', '2017-07-13', 1827.0, 2058.0, 978.0, 1636.0, 1863.0, 2537.0, 1061.0] (1)需求:取得以上列表中值大于2000的数值
使用列表推导式的形式①: [x for x in data if x > 2000]
得到如下结果:['driver', '2017-07-13', 2058.0, 2537.0]
原因:字符串类型数据被认为是无穷大数
(2)使用列表推导式的形式② : [int(x) if type(x) == float else x for x in data]
得到结果:['driver', '2017-07-13', 1827, 2058, 978, 1636, 1863, 2537, 1061]
两个例子肯定不够理解的,我们要实战一下,亲自上手敲敲代码
例1:过滤掉长度小于或等于3的字符串列表,并将剩下的转换成大写字母:
>>> names = ['Bob','Tom','alice','Jerry','Wendy','Smith'] >>> new_names = [name.upper()for name in names if len(name)>3] >>> print(new_names) ['ALICE', 'JERRY', 'WENDY', 'SMITH']
列表推导式的嵌套:
语法:[for 变量1 in 可迭代对象1 if 真值表达式1 for 变量2 in 可迭代对象2 if 真值表达式2]
例2:生成间隔5分钟的时间列表序列:
>>> time = ['%.2d:%.2d'%(h,m )for h in range(24) for m in range(0,60,5) ] >>> print(time) #%.2d表示输出结果长度为2,不满足长度的以0填充,满足且超过2长度的以自身填充。
['00:00', '00:05', '00:10', '00:15', '00:20', '00:25', '00:30', '00:35', '00:40', '00:45', '00:50', '00:55', '01:00', '01:05', '01:10', '01:15', '01:20', '01:25', '01:30', '01:35', '01:40', '01:45', '01:50', '01:55', '02:00', '02:05', '02:10', '02:15', '02:20', '02:25', '02:30', '02:35', '02:40', '02:45', '02:50', '02:55', '03:00', '03:05', '03:10', '03:15', '03:20', '03:25', '03:30', '03:35', '03:40', '03:45', '03:50', '03:55', '04:00', '04:05', '04:10', '04:15', '04:20', '04:25', '04:30', '04:35', '04:40', '04:45', '04:50', '04:55', '05:00', '05:05', '05:10', '05:15', '05:20', '05:25', '05:30', '05:35', '05:40', '05:45', '05:50', '05:55', '06:00', '06:05', '06:10', '06:15', '06:20', '06:25', '06:30', '06:35', '06:40', '06:45', '06:50', '06:55', '07:00', '07:05', '07:10', '07:15', '07:20', '07:25', '07:30', '07:35', '07:40', '07:45', '07:50', '07:55', '08:00', '08:05', '08:10', '08:15', '08:20', '08:25', '08:30', '08:35', '08:40', '08:45', '08:50'