Python推导式介绍

推导式是Python中很强大的、很受欢迎的特性,具有语言简洁,速度快等优点。推导式包括:

列表推导式字典推导式集合推导式嵌套列表推导式

NOTE: 字典和集合推导是最近才加入到Python的(Python 2.7 和Python 3.1以上版). 下面简要介绍下:

【列表推导式】

列表推导能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形

其基本格式如下:

[expr for value in collection if condition]

过滤条件可有可无,取决于实际应用,只留下表达式;相当于下面这段for循环:

?
1
2
3
4
result = []
for value in collection:
     if condition:
         result.append(expression)
例1 : 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
?
1
2
3
4
>>> names = [ 'Bob' , 'Tom' , 'alice' , 'Jerry' , 'Wendy' , 'Smith' ]
 
>>> [name.upper() for name in names if len(name)> 3 ]
[ 'ALICE' , 'JERRY' , 'WENDY' , 'SMITH' ]
【字典推导式】

字典和集合推导式是该思想的延续,语法差不多,只不过产生的是集合和字典而已。其基本格式如下:

{ key_expr: value_expr for value in collection if condition }

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

?
1
2
3
4
5
6
>>> 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 }

【集合推导式】

集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]。其基本格式如下:

{ expr for value in collection if condition }

例1: 用集合推导建字符串长度的集合

?
1
2
3
>>> strings = [ 'a' , 'is' , 'with' , 'if' , 'file' , 'exception' ]
>>> {len(s) for s in strings}    #有长度相同的会只留一个,这在实际上也非常有用
set([ 1 , 2 , 4 , 9 ])
【嵌套列表推导式】

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

?
1
2
3
>>> L = [[ 1 , 2 , 3 ],
          [ 4 , 5 , 6 ],
          [ 7 , 8 , 9 ]]
例1:  一个由男人列表和女人列表组成的嵌套列表,取出姓名中带有两个以上字母e的姓名,组成列表

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

用for循环实现:

?
1
2
3
4
5
6
7
8
9
10
tmp = []
for lst in names:
     for name in lst:
         if name.count( 'e' ) >= 2 :
             tmp.append(name)
 
print tmp
#输出结果
>>> 
[ 'Jefferson' , 'Wesley' , 'Steven' , 'Jennifer' ]
用嵌套列表实现:
?
1
2
3
4
5
>>> names = [[ 'Tom' , 'Billy' , 'Jefferson' , 'Andrew' , 'Wesley' , 'Steven' , 'Joe' ],
          [ 'Alice' , 'Jill' , 'Ana' , 'Wendy' , 'Jennifer' , 'Sherry' , 'Eva' ]]
 
>>> [name for lst in names for name in lst if name.count( 'e' )>= 2 ]  #注意遍历顺序,这是实现的关键
[ 'Jefferson' , 'Wesley' , 'Steven' , 'Jennifer' ]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值