Python v3.7.0
推导式(comprehensions),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。
列表推导式
格式:
[expression for item in iterable if condition]
expression :列表生成的值,也可以是*表达式*
for item in itreable:将item传入并迭代iterable
if condition:条件表达式
例子:
from functools import reduce
var = [i for i in range(10) if i % 2 == 0]
var1 = [i if i % 2 == 0 else 0 for i in range(10)]
sum = reduce(lambda x, y: x + y, var ) # 累加求和
print(var, var1, sum, sep='\n')
>>>
[0, 2, 4, 6, 8]
[0, 0, 2, 0, 4, 0, 6, 0, 8, 0]
20
嵌套的列表推导式
列表推导式中的初始表达式可以是任何表达式,包括另一个列表推导式。下面的例子来自Python官网,这个矩阵由长度分别为2,3,4的列表组成:
matrix = [
[1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11, 12]
]
下面的列表推导式将把3个子列表合成一个列表:
new = [ x for y in matrix for x in y]
print(new)
>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
上面的推导式等价于下面的语句:
new2 = []
for i in matrix:
new2.extend(i)
再看一个例子:给出一个有n个元素的列表s,s中是否有元素a,b满足a+b=0?找出数组S中所有满足条件的二元组,解法如下:
def solution(s):
# 确定好两次循环的区间范围
return [(v1, v2) for i, v1 in enumerate(s[:len(s) - 1]) for j, v2 in enumerate(s[i + 1:len(s)]) if v1 + v2 == 0]
上面的推导式和下面的循环是等价的:
res = []
for i, v1 in enumerate(s[:len(s) - 1]):
for j, v2 in enumerate(s[i + 1:len(s)]):
if v1 + v2 == 0:
res.append((v1, v2))
字典推导式
字典推导式的使用方法和列表推导式是类似的,只需要把[]
替换成{}
.
# 字典 key,value翻转 new_d = dict(zip(d.keys(), d.values()))
# 即使原字典中有相同的value也不会出错,最后一次的值会被返回
case = {'Name': 'Zara', 'Age': 7, 'Class': 'First', 'Score': 7}
case_revesed = {v: k for k, v in case.items()}
print(case_revesed)
>>>
{'Zara': 'Name', 7: 'Score', 'First': 'Class'}
# 将一个顺序的列表转化为字典
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
if len(list1) %2 != 0:
list1.append('')
new = {value: list1[index + 1] for index, value in enumerate(list1) if index % 2 == 0}
集合推导式
集合推导式,使用格式和字典推导式完全相同,用来生成集合类型的数据。
squared = {x ** 2 for x in [1, 1, 2]}
print(multiples, type(multiples), tuple(multiples), sep='\n')
>>>
{1, 4} <class 'set'>
生成器推导式
生成器推导式和列表推导式差不多,只是由中括号[]变成了括号(),但这并不是元组推导式,元组没有推导式。它返回一个可迭代对象,可以根据需要将他转化为列表或者元组。
multiples = (i for i in range(30) if i % 3 is 0)
print(multiples, type(multiples))
>>>
<generator object <genexpr> at 0x10e784408>
<class 'generator'>
(0, 3, 6, 9, 12, 15, 18, 21, 24, 27)
[To be continued...]