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

推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导,在Python2和3中都有支持:

列表(list)推导式

字典(dict)推导式

集合(set)推导式

一、列表推导式

1、使用[]生成list

基本格式

​[表达式 for 变量 in 列表]    或者  [表达式 for 变量 in 列表 if 条件]

例1:  过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母

>>> names = ['Bob','Tom','alice','Jerry','Wendy','Smith']    

>>> [name.upper() for name in names if len(name)>3]  

['ALICE', 'JERRY', 'WENDY', 'SMITH'] 

生成间隔5分钟的时间列表序列:

["%02d:%02d" %(h,m) for h in range(0, 24) for m in range(0, 60, 5)]

例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]  

[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

例3:  求M中3,6,9组成的列表

>>> M = [[1,2,3],[4,5,6],[7,8,9]]

>>> M  

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]  

>>> [row[2] for row in M]   

[3, 6, 9] 

#或者用下面的方式  

>>> [M[row][2] for row in (0,1,2)]  

[3, 6, 9]  

例4:  求M中斜线1,5,9组成的列表

>>> M  

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]  

>>> [ M[i][i]  for i in range(len(M))]   即打印 M[0][0],M[1][1],M[2][2]

[1, 5, 9]  

例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)]  

[2, 4, 6, 12, 15, 18, 28, 32, 36]  

>>> [[M[row][col]*N[row][col] for col in range(3)] for row in range(3)]  

[[2, 4, 6], [12, 15, 18], [28, 32, 36]]  

>>> [[M[row][col]*N[row][col] for row in range(3)] for col in range(3)]  

[[2, 12, 28], [4, 15, 32], [6, 18, 36]]  

例5:  讲字典中age键,按照条件赋新值

>>> bob  

{'pay': 3000, 'job': 'dev', 'age': 42, 'name': 'Bob Smith'}  

>>> sue  

{'pay': 4000, 'job': 'hdw', 'age': 45, 'name': 'Sue Jones'}  

>>> people = [bob, sue]  

>>> [rec['age']+100 if rec['age'] >= 45 else rec['age'] for rec in people]  # 注意for位置  

[42, 145]  

列表推导式总共有两种形式:

①[x for x in data if condition]

    此处if主要起条件判断作用,data数据中只有满足if条件的才会被留下,最后统一生成为一个数据列表

②[exp1 if condition else exp2 for x in data]

    此处if...else主要起赋值作用,当data中的数据满足if条件时将其做exp1处理,否则按照exp2处理,最后统一生成为一个数据列表

例子如下:

data = ['driver', '2017-07-13', 1827.0, 2058.0, 978.0, 1636.0, 1863.0, 2537.0, 1061.0]

(1)若我要取得以上列表中值大于2000的数值,这里可以使用列表推导式的形式①:

[x for x in data if x > 2000]

得到如下结果(字符串类型数据被认为是无穷大数):

 ['driver', '2017-07-13', 2058.0, 2537.0]

(2)若要解决我上面提到的问题,则需要使用列表推导式的形式②

[int(x) if type(x) == float else x for x in data]

得到结果:

 ['driver', '2017-07-13', 1827, 2058, 978, 1636, 1863, 2537, 1061]

1、使用[]生成list

基本格式

variable = [out_exp_res for out_exp in input_list if out_exp == 2]

  out_exp_res:  列表生成元素表达式,可以是有返回值的函数。

  for out_exp in input_list:  迭代input_list将out_exp传入out_exp_res表达式中。

  if out_exp == 2:  根据条件过滤哪些值可以。

例一:

multiples = [i for i in range(30) if i % 3 is 0]

print(multiples)

# Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

例二:

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

将俩表推导式的[]改成()即可得到生成器。

multiples = (i for i in range(30) if i % 3 is 0)

print(type(multiples))

#  Output: <type 'generator'>

二、字典推导式

字典推导和列表推导的使用方法是类似的,只不中括号该改成大括号。

{ key_expr: value_expr for value in collection if condition }

直接举例说明:

l = ["%02d:%02d" %(h,m) for h in range(0, 24) for m in range(0, 60, 5)]

d = {key:0 for key in s}

print(d)

print(sorted(d.key()))

例1:  用字典推导式以字符串以及其长度建字典

>>> strings = ['import','is','with','if','file','exception']  


>>> D = {key: val for val,key in enumerate(strings)}  


>>> D  

{'exception': 5, 'is': 1, 'file': 4, 'import': 0, 'with': 2, 'if': 3}  

例子一:大小写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}

例子二:快速更换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'}

三、集合推导式

它们跟列表推导式也是类似的。 唯一的区别在于它使用大括号{}。

{ expr for value in collection if condition }

例一:

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}    #有长度相同的会只留一个,这在实际上也非常有用 

​ 

set([1, 2, 4, 9])  

嵌套列表是指列表中嵌套列表,比如说:

>>> L = [[1,2,3],[4,5,6],[7,8,9]]  

例1: 一个由男人列表和女人列表组成的嵌套列表,取出姓名中带有两个以上字母e的姓名,组成列表

names = [['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']]  

用for循环实现:

tmp = []  

for lst in names:  

    for name in lst:  

        if name.count('e') >= 2:  

            tmp.append(name)  


print tmp  

#输出结果  

>>>   

['Jefferson', 'Wesley', 'Steven', 'Jennifer']  

用嵌套列表实现:

>>> [name for lst in names for name in lst if name.count('e')>=2]  #注意遍历顺序,这是实现的关键  

['Jefferson', 'Wesley', 'Steven', 'Jennifer']  

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,825评论 6 546
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,814评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,980评论 0 384
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 64,064评论 1 319
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,779评论 6 414
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,109评论 1 330
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,099评论 3 450
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,287评论 0 291
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,799评论 1 338
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,515评论 3 361
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,750评论 1 375
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,221评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,933评论 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,327评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,667评论 1 296
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,492评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,703评论 2 380

推荐阅读更多精彩内容