Python笔记002-列表推导式

Python笔记002-列表推导式

以下是我学习《流畅的Python》后的个人笔记,现在拿出来和大家共享,希望能帮到各位Python学习者。

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

本篇主要知识点:

  1. 列表推导式可以从一个序列快速构建另一个序列,非常方便快捷,强烈建议使用。

  2. 列表推导式适用于简单的for循环,可以对一个列表中的每个元素进行相同操作,也可以挑选出原列表中满足一定条件的元素组成新的列表。

  3. 集合推导式应用比较少,而字典推导式却应用广泛,可以从一个dict中选择出满足一定条件的items组成新的dict,也可以对原dict中的key或value进行操作。

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

1. 列表推导式

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

而且,Python的内部实现对列表推导式做了大量优化,可以保证运行速度非常快。

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

## 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循环来实现简单的业务时,不妨使用列表推导式。

### 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来表示。

列表推导式还可以实现嵌套,一般为了可读性比较强,最多嵌套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 (作者) 安道 , 吴珂 (译者)。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容