推导式comprehensions(又称解析式),是python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。共有三种推导,在python2和3中都有支持:
.列表(list)推导式
.字典(dict)推导式
.集合(set)推导式
一、列表推导式
1、使用[]生成list
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]
例1:整除3的数字列表
numbers = []
for x in range(100):
if x % 3 == 0:
numbers.append(x)
使用推导式实现
numbers = [x for x in range(100) if x % 3 == 0]
例2:
def squared(x):
return x*x
multiples = [squared(i) for i in range(30) if i % 3 is 0]
print multiples
# Output: [0, 9, 36, 81, 144, 225, 324, 441, 576, 729]
2、使用()生成generator
将俩表推导式的[]改成()即可得到生成器 --yeild
multiples = (i for i in range(30) if i % 3 is 0)
print(type(multiples))
# Output:
二、字典式推导式
字典式推导式和列表推导的使用方法类似,只不过中括号改成大括号。直接举例说明
例1:快速更换key和value
mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print mcase_frequency
# Output: {10: 'a', 34: 'b'}
例2:大小写key合并
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
# Output: {'a': 17, 'b': 34}
三、集合推导式
它们跟列表推导式也是类似的。唯一的区别在于它使用大括号{}。
例一:
squared = {x**2 for x in [1, 1, 2]}
print(squared)
# Output: set([1, 4])
例1:用集合推导 字符串长度的集合
strings = ['a','is','with','if','file','exception']
{len(s) for s in strings} #有长度相同的{}会只留一个 []多个,这在实际上也非常有用
# Output: set([1, 2, 4, 9])
练习:
0到9的次方:
squares = []
for x in range(10):
squares.append(x**2)
使用推导实现
squares = [x**2 for x in range(10)]
1:将单词长度大于3的转为大写输出
names = ['bob','tom','alice','jerry','wendy','smith']
print([name.upper() for name in names if len(name)>3])
2:求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元组列表
[(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1]
3:求m中3,6,9组成的列表
m = [[1,2,3],[4,5,6],[7,8,9]]
[row[2] for row in m]
#或
[m[row][2] for row in (0,1,2)]
4:求m中斜线1,5,9组成的列表
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[m[i][i] for i in range(len(m))]
5:求m,n中矩阵各个元素的乘积
m = [[1,2,3],[4,5,6],[7,8,9]]
n = [[2,2,2],[3,3,3],[4,4,4]]
[m[row][col]*n[row][col] for row in range(3) for col in range(3)]
[[m[row][col]*n[row][col] for col in range(3)] for row in range(3)]
[[m[row][col]*n[row][col] for row in range(3)] for col in range(3)]
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/推导.py
[2, 4, 6, 12, 15, 18, 28, 32, 36]
[[2, 4, 6], [12, 15, 18], [28, 32, 36]]
[[2, 12, 28], [4, 15, 32], [6, 18, 36]]
Process finished with exit code 0
6:结合两个列表的元素,如果元素之间不相等的话
combs = []
for x in [1,2,3]:
for y in [3,1,4]:
if x != y:
combs.append((x, y))
#推导
[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
7:
create a list of 2-tuples like (number, square)
[(x, x**2) for x in range(6)]