推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导,在Python2和3中都有支持:
- 列表(list)推导式
- 字典(dict)推导式
- 集合(set)推导式
一、列表推导式
1、使用[]生成list
基本格式
var = [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: 根据条件过滤哪些值可以。
(1)最简单的列表推导式
>>> [i for i in '123'] ['1', '2', '3']
(2)带条件的列表推导式
单条件
>>> [i for i in '123' if i!='2'] ['1', '3']
多条件
>>> [i for i in '123' if i!='2' if i!='3'] ['1']
if-else:
>>> [x+1 if x>=5 else x+5 for x in range(10)] [5, 6, 7, 8, 9, 6, 7, 8, 9, 10]
(3)两个来源的列表推导式
1.笛卡尔积列表推导式
>>> [(i,j) for i in '123' if i!='2' for j in '456'] [('1', '4'), ('1', '5'), ('1', '6'), ('3', '4'), ('3', '5'), ('3', '6')]
2.非笛卡尔积列表推导式
>>> [(i,j) for i in range(3) for j in range(6) if (i+j)%3==0] [(0, 0), (0, 3), (1, 2), (1, 5), (2, 1), (2, 4)]
(4)列表推导式生成匿名函数列表
>>> func=[lambda x: x*i for i in range(3)] >>> func [<function <listcomp>.<lambda> at 0x0000028F1A3D6AF8>, <function <listcomp>.<lambda> at 0x0000028F19D50AF8>, <function <listcomp>.<lambda> at 0x0000028F1A409048>] >>> [f(2) for f in func] [4, 4, 4] >>> func=[lambda x,i=i: x*i for i in range(3)] >>> [f(2) for f in func] [0, 2, 4]
(5)嵌套推导式
>>> list_of_list = [[1,2,3],[4,5,6],[7,8]] >>> >>> #flatten ... print([y for x in list_of_list for y in x]) [1, 2, 3, 4, 5, 6, 7, 8]
2、使用()生成generator
将俩表推导式的[]改成()即可得到生成器。
>>> gnrt = (i for i in range(30) if i % 3 is 0) >>> print(type(gnrt)) <class 'generator'>
二、字典推导式
字典推导和列表推导的使用方法是类似的,只不中括号该改成大括号。直接举例说明:
大小写合并计算:
>>> mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3} >>> mcase_frequency = { ... k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) ... for k in mcase.keys() ... if k.lower() in ['a','b'] ... } >>> print(mcase_frequency) {'a': 17, 'b': 34}
三、集合推导式
它们跟列表推导式也是类似的。 唯一的区别在于它使用大括号{}。
>>> {x**2 for x in [1, 1, 2]} {1, 4}
完结!!