您的位置:首页 > 编程语言 > Python开发

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

2018-03-25 15:49 603 查看
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]

I
c8ab
n [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']]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python list dict set 推导式
相关文章推荐