python列表、集合以及字典的推导式

1、基本的推导式

       (1)列表推导式是python最受欢迎的功能之一,利用它可以非常高效的构造新的列表:只需一条简洁的代码,即可对于族元素进行过滤,并对得到的元素执行变形,基本的语法结构如下:

[exp for val in collection if condition] #列表推导式

       上面的代码相当于下面这段循环:

 result = []
   ...: for val in collection:
   ...:     if condition:
   ...:         result.append(val)

       过滤器的条件可以省略,只留下表达式。如下面给定的字符串列表,过滤掉长度小于2的字符串,并将字符串转换为大写的形式:

In [8]: strs = ['py', 'tuple', 'list', 'python','p', 'Pip']

In [9]: [str.upper() for str in strs if len(str)>2]
Out[9]: ['TUPLE', 'LIST', 'PYTHON', 'PIP']

       (2)集合和字典的推导式是这种思想的一种自然延续,他们语法差不多,产生的结果分别是集合和字段。字典推导式的语法形式如下:

dict_comp = {key-expr: value-expr for value in collection if condition}

       集合推导式与列表推导式非常相似,唯一区别在于它使用的是大括号(花括号)而不是中括号(方括号),如下:

set_comp = {expr for value in collection if condition}

       下面看集合推导式和字典推导式的示例:

In [11]: strs = ['py', 'tuple', 'list', 'python','p', 'Pip']

In [12]: {len(str) for str in strs}
Out[12]: {1, 2, 3, 4, 5, 6}

In [13]: #字段推导式

In [14]: loc_mapping = {value:idx for idx, value in enumerate(strs)}

In [15]: loc_mapping
Out[15]: {'Pip': 5, 'list': 2, 'p': 4, 'py': 0, 'python': 3, 'tuple': 1}

       对于字典推导式,还有另一种方式:

In [16]: loc_mapping2 = dict((value,idx) for idx, value in enumerate(strs))

In [17]: loc_mapping2
Out[17]: {'Pip': 5, 'list': 2, 'p': 4, 'py': 0, 'python': 3, 'tuple': 1}

2、 嵌套列表的推导式

       先看下面这个示例:

In [18]: name_all = [['qqing','wqing','qinggo','ewv','wqc'],['list','listqq','tep','sdk','pqrst']]
In [21]: qqs=[]

In [22]: for name in name_all:
    ...:     qq=[n for n in name if n.count('q')>=2]
    ...:     qqs.extend(qq)
    ...:

In [23]: qqs
Out[23]: ['qqing', 'listqq']

       再看嵌套列表的推导式使用一种更简洁的方式实现:

In [25]: qqs2=[n for name in name_all for n in name if n.count('q')>=2]

In [26]: qqs2
Out[26]: ['qqing', 'listqq']

       咋一看,嵌套列表的推导式不好,实际上推导式中for的部分是按照嵌套顺序排列的,而过滤条件还是跟之前一样放在后面的。下面是另一个示例,将一个字符串元组构成的列表“扁平化”为一个简单的字符串列表:

In [27]: lstr =  [('java', 'python', 'c++'), ('for', 'while' ,'do...while'), ('in', 'isnull', 'not null')]

In [28]: result = [x for tu in lstr for x in tu]

In [29]: result
Out[29]:
['java',
 'python',
 'c++',
 'for',
 'while',
 'do...while',
 'in',
 'isnull',
 'not null']

       更容易理解记忆的方式是:嵌套for循环中各个for的顺序是怎样的,嵌套推导式中各个for表达式的顺序就是怎样的!

        同时应注意,上述示例中的语法与“列表推导式中的列表推导式”是不一样的,如下面的示例语法也是正确的,但结果却不同:

In [30]: result2 = [[x for x in tu] for tu in lstr]

In [31]: result2
Out[31]:
[['java', 'python', 'c++'],
 ['for', 'while', 'do...while'],
 ['in', 'isnull', 'not null']]
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值