后端开发 \ Python \ Python--列表解析

Python--列表解析

总点击65
简介:列表解析的出现,对于Python来说,绝对算是一种革命性的变化。我们可以通过一种极其简洁的列表解析的式子,完成符合某种规律的列表的构建,或者替代函数式编程中 map(),filter() 这些函数的作用(函数式编程以后我会再做总结),实现对一个序列的筛选,依次计算等功能。

列表解析的出现,对于Python来说,绝对算是一种革命性的变化。我们可以通过一种极其简洁的列表解析的式子,完成符合某种规律的列表的构建,或者替代函数式编程中 map(),filter() 这些函数的作用(函数式编程以后我会再做总结),实现对一个序列的筛选,依次计算等功能。

先来看看列表解析的语法:[expr for iter_val in iterable]


简单说,就是对于一个可迭代的对象中的每一个元素,通过表达式对该元素作用,得到一个计算结果,然后再通过for循环遍历这个可迭代对象的每一个元素,将作用后的结果构成一个列表。这个作用后的结果可能是由之前元素计算得到的新对象,也可能就是原先的元素。

概念本身没什么可多说的,但是太不直观。所以,我会举以下的例子说明列表解析到底是如何使用的。

1. 依次对序列中的每一个值实施计算

给出一个序列,需要得到这个序列中的每一个数的平方

a = [1,2,3,4,5]

result = [x ** 2 for x in a] # x是元素,列表a是可迭代对象

print(result) # >>> [1,9,16,25]

当然,可迭代对象如果符合某种规律,也可以通过 range() 表达式表示

print([x + 1 for x in range(10)]) # >>> [1,5,6,7,8,10]

表达式除了可以直接通过操作符书写,还可以是一个已经定义好的函数

def fun(num):

return 2 * num - 1

print([fun(x) for x in range(3,10)]) # >>> [5,11,13,15,17]

2. 筛选序列

其实也是对序列中每个元素进行计算,只不过起到的是筛选的功能

比如,现在想要筛选出2~30当中所有的素数,构成一个列表

import math

# 定义素性判断函数

def isPrime(num):

k = int(math.sqrt(num))

for i in range(2,k + 1):

if num % i == 0:

return False

return True

print([x for x in range(2,31) if isPrime(x)]) # >>> [2,19,23,29]

3. 构建数对

现在,要做的事情是构建 (1,3)(1,3)

那么可以通过列表解析式,这样生成

[(x + 1,y + 1) for x in range(2) for y in range(3)]

4. 统计字符

当然,还可以通过列表解析来统计字符串的字符数

s = "I wrote Python"

print(sum([len(i) for i in s.split()])) # >>> 12

这个例子当中,先是通过 s.split() 构成序列,序列的每一个元素是字符串s的每一个单词,然后通过 [len(i) for i in s.split()] 生成由这些单词的长度构成的列表,最后通过 sum() 函数加和,可见,本来需要好几行代码才完成的工作,通过列表解析,我们只需要简单的1行代码。

意见反馈 常见问题 官方微信 返回顶部