为了丰富学员们的课外知识,老师让我们助理分享这套Python系列教程。由于Python教程并非老师所写,所以不如老师的AI教学风趣幽默,望大家见谅!想要学习AI技术的新朋友可以去www.captainbed.net。本公众号由助理负责运营,只免费分享课外知识,不回复任何私信。
今天介绍一个Python的高级操作——列表解析表达式(list comprehension expression),它提供了一种处理像矩阵这样结构的强大工具。例如,假设我们需要从矩阵中提取出第二列。因为矩阵是按照行进行存储的,所以通过简单的索引即可获取行,要想简单地获得列那么就要使用列表解析表达式。下面就用列表解析表达式获取了第二列的所有元素。
>>> col2 = [row[1] for row in M] # Collect the items in column 2
>>> col2
[2,5,8]
>>> M # The matrix is unchanged
[[1,2,3],[4,5,6],[7,8,9]]
列表解析源自集合的概念。它是一种通过对序列中的每一项运行一个表达式来创建一个新列表的方法,每次一个,从左至右。列表解析是编写在方括号中的,并且由使用了同一个变量名(上面的变量名是row)的表达式和循环结构组成。上面的代码的意思就是:“把矩阵M的每个row中的row[1],放在一个新的列表中”。其结果就是一个包含了矩阵的第二列的新列表。实际应用中的列表解析可以更复杂:
>>> [row[1] + 1 for row in M] # Add 1 to each item in column 2
[3,6,9]
>>> [row[1] for row in M if row[1] % 2 == 0] # Filter out odd items
[2,8]
例如,这里的第一个操作,把它搜集到的每一个元素都加了1,第二个使用了一个if条件语句,通过使用%求余表达式(取余数)过滤了结果中的奇数。
下面第一个操作取出矩阵M中i索引对应的元素。第二个操作将字符串的每个字母复制一份:
>>> diag = [M[i][i] for i in [0,1,2]] # Collect a diagonal from matrix
>>> diag
[1,5,9]
>>> doubles = [c * 2 for c in 'spam'] # Repeat characters in a string
>>> doubles
['ss','pp','aa','mm']
列表解析以及相关的内容函数map和filter比较复杂,就不过多讲述了。这里简要说明的目的是要告诉大家Python中有简单的工具,也有高级的工具。列表解析是一个可选的特性,在实际应用中比较方便,并常常具有处理速度上的优势。
下面给出一些高级用法,大家了解一下就行,暂时看不懂也没有关系:
>>> G = (sum(row) for row in M) # Createa generator of row sums
>>> next(G)
6
>>> next(G) # Run the iteration protocol
15
>>> list(map(sum,M)) # Map sum over items in M
[6,15,24]
>>> {sum(row) for row in M} # Create a set of row sums
{24,6,15}
>>> {i : sum(M[i]) for i in range(3)} # Creates key/value table of row sums
{0: 6,1: 15,2: 24}
>>> [ord(x) for x in 'spaam'] # List of character ordinals
[115,112,97,97,109]
>>> {ord(x) for x in 'spaam'} # Sets remove duplicates
{112,97,115,109}
>>> {x: ord(x) for x in 'spaam'} # Dictionary keys are unique
{'a': 97,'p': 112,'s': 115,'m': 109}