2.9 推导式
推导式(comprehensions)又称解析式,是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。Python共有3种推导式:
• 列表(list)推导式;
• 字典(dict)推导式;
• 集合(set)推导式。
2.9.1 初识推导
先来看一段代码:
T=[(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1]
好长好奇怪,其实这就是常见的推导式,其基本语法如下:
variable = [expr for value in seq if condition]
首先需要一个变量接收推导式,右侧的[ ]表示这是列表推导式,字典或集合推导式都是使用{ }。expr是一个表达式或变量,可想象成每个符合条件的值。推导式中的if是根据条件过滤哪些值,不是必选。for循环可理解为某个区间或某个范围。
下面以列表方式举例:
T = [i for i in range(40) if i % 4 is 0] print(T)
返回结果:
[0, 4, 8, 12, 16, 20, 24, 28, 32, 36]
从结果可以看出,返回的是列表形式,通过if条件过滤下来的是可以被4整除的数。通过for循环依次输出40以下的满足if条件的值。
因为在语法中[ ]里面的第1个变量也可以是表达式,所以我们再改为表达式,这里创建一个函数。
def seq(x): return x*x T = [seq(i) for i in range(40) if i % 4 is 0] print(T)
以上输出变量的平方值:
[0, 16, 64, 144, 256, 400, 576, 784, 1024, 1296]
字典推导式、集合推导式与列表推导式的使用语法一致,只是需要将[ ]改为{ }。下面创建字典推导式,输出指定键的内容。
【示例2-30】
首先创建一个字典dic1,有5个键-值对。再创建一个字典推导式dic1_T,过滤条件是字典的键a、b或A、B。返回的内容是t.lower(): dic1.get(t)。lower()返回小写,get()获取指定键的值。上述代码结果是:
{'a': 9, 'b': 30}
2.9.2 嵌套推导
列表都是可以嵌套的,列表的推导式也可以嵌套。下面用一个广泛流行的例子来说明。
有一个嵌套的名字列表,第1排是男孩名字,第2排是女孩名字。
names = [ ['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'], ['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva'] ]
如果使用for循环输出“姓名中带有两个以上字母e的”姓名,那么代码如下:
tmp是一个临时列表,用于保存符合条件的姓名,代码中用了两个for遍历嵌套列表,代码结果是:
['Jefferson', 'Wesley', 'Steven', 'Jennifer']
嵌套推导式会让代码更加简洁,相同的嵌套列表,如果要用推导式的形式,代码如下:
T=[name for lst in names for name in lst if name.count('e') >= 2] print(T)
读者可以仔细分析嵌套列表推导式的每个关键词,也是两个for,只是都写在了一行里,其实关键词都差不多,上述代码的输出结果也与前面相同。