0
点赞
收藏
分享

微信扫一扫

python系列教程42


声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好的理解人工智能技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是要由所写,所以不如我的人工智能技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!

今天介绍一个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}


我的微信公众号是“人工智能知识分享”

python系列教程42_人工智能


举报

相关推荐

0 条评论