标签:10 推导 python 代码 list 列表 row
Python中的列表推导式
Python里面有个很棒的语法糖(syntactic sugar),它就是 list comprehension
,有人把它翻译成“列表推导式”,也有人翻译成“列表解析式”。名字听上去很难理解,但是看它的语法就很清晰了。虽然名字叫做 list comprehension,但是这个语法同样适用于dict、set等这一系列可迭代(iterable)数据结构。
语法规范:
out_list = [out_express for out_express in input_list if out_express_condition]
其中的 if
条件判断根据需要可有可无。
下面看一个具体的例子,生成一个包含10以内的偶数的list:
In [1]: evens = [i for i in range(10) if i % 2 == 0] In [2]: evens Out[2]: [0, 2, 4, 6, 8]
由for循环升级到列表推导式:
在没有了解list comprehension
之前,上面那个生成偶数list的通常做法是用for
循环:
evens = [] for i in range(10): if i % 2 == 0: evens.append(i)
很明显,循环占用了4行代码,而只用了1行代码。
文章开始说到推导式的语法规范时,我们讲了if
表达式是可有可无的,这也符合我们编程遇到的实际情况。比如,要生成一个10以内的整数的平方的列表:
squares = [i**2 for i in range(10)]
复杂的嵌套循环
我们先来看一个例子,把一个矩阵(以列表为元素的列表)展平为一个列表。首先,我们用for
循环来实现一下:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
flattened = []
for row in matrix:
for i in row:
flattened.append(i)
接着我们用列表推导式实现该功能:
flattened = [i for row in matrix for i in row]
还是一行代码就搞定,但一行里面有两个for
,看起来很乱,两个for
,哪个在前哪个在后呢?只要记住他们的顺序和不用推导式的原始for循环是一致的即可。
推导式的可读性
一行代码搞定几行代码的事情,看上去很简洁,但是读起来很费劲,尤其是当条件语句很长的时候,把这一行代码变得很长,超过了代码规范规定的长度(一般是80个字符),也使得理解代码变得困难。
面对一行长长的代码该如何下口读,如何理解呢?别着急,好在Python允许在中括号、花括号之间断行:
列表推导式的断行:
断行前:
evens = [i for i in range(10) if i % 2 == 0]
断行后:
evens = [ i for i in range(10) if i % 2 == 0 ]
带嵌套循环的推导式的断行:
断行前:
flattened = [i for row in matrix for i in row]
断行后:
flattened = [ i for row in matrix for i in row ]
字典(dict)和集合(set)的推导式:
前面我们也提到过,推导式不仅仅适用于列表,它同样使用于字典dict和集合set。
把一个字典的key和value互换:
changed = {value: key for key, value in input_dict.items()}
用一个列表的所有单词的首字母生成一个集合:
chars = {w[0] for w in words_list}
通过以上讲解就可以轻松掌握Python的列表推导式(list comprehension
)了,简而言之,就是把普通的多行for循环压缩成一行代码,这种压缩语法适用于列表、字典、集合等可迭代数据结构(iterables)。
推导式使用if else版
模板:[exp1 if condition else exp2 for x in data]
示例
# 一行代码实现data中偶数位的元素加2
data = [1,2,3,4,5,6,7,8,9]
test = [data[i]+2 if (i+1)%2 == 0 else data[i] for i in range(len(data))]
print(test)
# 结果
[1, 4, 3, 6, 5, 8, 7, 10, 9]
此处if…else…主要起赋值作用,当data中的数据满足if条件时将其做exp1处理,否则按照exp2处理,最后统一生成为一个数据列表
标签:10,推导,python,代码,list,列表,row 来源: https://www.cnblogs.com/lhTest/p/15556594.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。