python推导式(列表推导式、字典推导式、集合推导式)

推导式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)]





你可能感兴趣的:(python推导式(列表推导式、字典推导式、集合推导式))