Python笔记002-列表推导式

Python笔记002-列表推导式

如下是我学习《流畅的Python》后的我的笔记,如今拿出来和你们共享,但愿能帮到各位Python学习者。git

首次发表于: 微信公众号:科技老丁哥,ID: TechDing,敬请关注。

本篇主要知识点:

  1. 列表推导式能够从一个序列快速构建另外一个序列,很是方便快捷,强烈建议使用。github

  2. 列表推导式适用于简单的for循环,能够对一个列表中的每一个元素进行相同操做,也能够挑选出原列表中知足必定条件的元素组成新的列表。编程

  3. 集合推导式应用比较少,而字典推导式却应用普遍,能够从一个dict中选择出知足必定条件的items组成新的dict,也能够对原dict中的key或value进行操做。微信

  4. 列表推导式有极其普遍的应用场景,能够用于循环执行某个函数,也能够用于将某个list转换为dict,或将dict转换为list等。函数

1. 列表推导式

列表推导式是构建列表(list)的一种快捷方式,并且可读性强,用它编写的代码很是有Python味儿,是一种很是推荐的编程风格。学习

并且,Python的内部实现对列表推导式作了大量优化,能够保证运行速度很是快。优化

列表推导式能够仅仅使用[]来生成一个list,基本代码格式为:[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件],以下为这两种格式的实现方法:spa

## demo1:
alist=[1,2,3,50,89,26,30]
odd=[i for i in alist if i%2==1] # 选出列表alist中全部的奇数
print(odd) # [1, 3, 89]
复制代码

Python中的列表推导式主要替换了Java或C语言中的for循环,当你想使用for循环来实现简单的业务时,不妨使用列表推导式。code

### demo2:
alist=[1,2,3,50,89,26,30]
plus=[i*2+10 for i in alist] # 简单算术操做
print(plus) # [12, 14, 16, 110, 188, 62, 70]
复制代码

固然,若是是比较复杂的业务,须要多行代码才能实现,那仍是老老实实用for循环来实现吧。从这一点来讲,列表推导式相似于函数中的lambda表达式,简单的函数能够直接用lambda来表示。orm

列表推导式还能够实现嵌套,通常为了可读性比较强,最多嵌套3层。

### demo3: 列表推导式的嵌套用法
alist=[1,2,5]
blist=['A','B','C']
combined=[b+'_'+str(a) for b in blist for a in alist]
print(combined) # ['A_1', 'A_2', 'A_5', 'B_1', 'B_2', 'B_5', 'C_1', 'C_2', 'C_5']

# demo4: 加入判断条件: 只用奇数
combined2=[b+'_'+str(a) for b in blist for a in alist if a%2==1]
print(combined2) # ['A_1', 'A_5', 'B_1', 'B_5', 'C_1', 'C_5']
复制代码

2. 其余推导式

列表推导式并不只仅适用于列表(list),还适用于其余序列类型,好比set, dict等。因此有的人将生成set的叫作集合推导式,把生成dict的叫作字典推导式。

集合推导式的用法和列表推导式同样,只是将[]改成{}便可,但获得的集合元素之间若是重复,则仅仅保留一个,这是由set的特性:元素不能重复决定的。

### 集合推导式:
## demo1:
alist=[1,2,3,50,89,26,30]
odd={i for i in alist if i%2==1} # 选出列表alist中全部的奇数
print(odd) # {89, 1, 3}
复制代码

字典推导式的用法和列表推导式同样,只是将[]改成{},但迭代的对象是一个字典类型。

使用字典推导式能够实现不少多样化操做,好比下面将key,value互换。

### 字典推导式:
# demo1: key,value互换;
dictA={'a':10,'b':20,'c':30}
changed={value:key for key,value in dictA.items()}
print(changed) # {10: 'a', 20: 'b', 30: 'c'}
复制代码

还好比:单独对keys进行迭代,能够选出keys知足必定条件items组成新的dict

### demo2: 选出key是奇数的items
dictB={1:'10',2:'20',3:'30',4:'40'}
odd_dict={key:dictB[key] for key in dictB.keys() if key%2==1}
print(odd_dict) # {1: '10', 3: '30'}
复制代码

同理,也能够单独对values进行迭代,选出values知足必定条件的items组成新的dict.

3. 应用示例

列表推导式还有些其余应用场景,好比:

循环执行某个函数:

# 循环执行某个函数:
import time
def func_test(x):
    print('start test: {}'.format(x))
    time.sleep(1)
    print('end test: {}'.format(x*2)) # 仅仅乘以2
[func_test(x) for x in range(10,15,2)] # 使用列表推导式循环执行某个函数
复制代码

start test: 10 end test: 20 start test: 12 end test: 24 start test: 14 end test: 28

循环执行函数,并获取返回值:

# 循环执行某个函数:
import time
def func_test(x):
    print('start test: {}'.format(x))
    time.sleep(1)
    print('end test: {}'.format(x*2)) # 仅仅乘以2
    return x*2
result=[func_test(x) for x in range(10,15,2)] # 使用列表推导式循环执行某个函数
print(result) # [20, 24, 28]
复制代码

经过列表推导式和字典推导式的灵活运用,能够将dict类型数据和list数据相互转化,好比:

# 由list生成字典:
blist=['A','B','C']
dict_from_list={b:str(idx+10) for idx,b in enumerate(blist)}
print(dict_from_list) # {'A': '10', 'B': '11', 'C': '12'}

# 由dict生成list
dictB={1:'10',2:'20',3:'30',4:'40'}
list_from_dict=[key for key,_ in dictB.items() if key%2==0] # 选出偶数的key
print(list_from_dict) # [2, 4]
复制代码

首次发表于: 微信公众号:科技老丁哥,ID: TechDing,敬请关注。

本文全部代码都已经上传到个人github,欢迎下载

参考资料:

  1. 《流畅的Python》,Luciano Ramalho (做者) 安道 , 吴珂 (译者)。
相关文章
相关标签/搜索