Python3 之 列表推导式

列表推导式(又称列表解析式)提供了一种简明扼要的方法来创建列表。

它的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是 0 个或多个 for 或者 if 语句。那个表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以 if 和 for 语句为上下文的表达式运行完成之后产生。

列表推导式的执行顺序:各语句之间是嵌套关系,左边第二个语句是最外层,依次往右进一层,左边第一条语句是最后一层。

下面看一个具体的例子:

  实例1:求10以内每个数字的平方值,保存到列表中

  以往,我们会用for循环来实现:

1 list1 = []
2 for x in range(10):
3     list1.append(x**2)

  如果用列表推导式,如下:

1 list1 = [x ** 2 for x in range(10)]

  只用一行代码,就搞定。

  实例3:复杂的循环嵌套

  把一个矩阵(以列表为元素的列表)展平为一个列表。首先,我们用for循环来实现一下:

 1 matrix = [
 2     [1, 2, 3],
 3     [4, 5, 6],
 4     [7, 8, 9],
 5 ]
 6 
 7 # 方法1:用for循环来处理
 8 mylist_1 = []
 9 for i in matrix:
10     for j in i:
11         mylist_1.append(j)
12 print(mylist_1)         #[1, 2, 3, 4, 5, 6, 7, 8, 9]

  接下来,我们用列表推导式实现:

1 mylist_2 = [j  for i in matrix for j in i]
2 print(mylist_2) #[1, 2, 3, 4, 5, 6, 7, 8, 9]

还是一行代码就搞定,但一行里面有两个for,看起来很乱,两个for,哪个在前哪个在后呢?只要记住他们的顺序和不用推导式的原始for循环是一致的即可。

列表推导式的可读性:

一行代码搞定几行代码的事情,看上去很简洁,但是读起来很费劲,尤其是当条件语句很长的时候,把这一行代码变得很长,超过了代码规范规定的长度(一般是80个字符),也使得理解代码变得困难。

面对一行长长的代码该如何下口读,如何理解呢?别着急,好在Python允许在中括号、花括号之间断行:

列表推导式断行:

断行前:

1 mylist_2 = [j  for i in matrix for j in i]

断行后:

1  mylist_2 = [
2      j
3      for i in matrix
4      for j in i
5   ]  

字典(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)。

原文地址:https://www.cnblogs.com/gengyufei/p/11333094.html