Lesson 12

  • v1.0.0,2016.10 by David.Yi
  • v1.1, 2020.4.30 edit by David Yi

本次内容要点

  • 列表生成器用法
  • 思考一下

列表生成式

列表生成式是 Python 内置的非常简单却强大的可以用来创建list的方法。

大家都知道,要生成一个这样的 list:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

可以用 list(range(1, 11))

那么如果要生成这样的 list:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100],应该怎么办呢?


In [1]:
# 用循环来生成

list1 = []
for x in range(1, 11):
    list1.append(x * x)
    
print(list1)


[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

In [2]:
# 用列表生成式
# 是不是更加简洁和优雅?

list1 = [ x * x for x in range(1, 11)]
print(list1)


[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

列表生成式用法

写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把 list 创建出来,十分有用。

在列表生成式后面还可以加上判断,过滤出结果为偶数的结果

[x * x for x in range(1, 11) if x % 2 == 0]


In [2]:
# 在列表生成式后面加上判断,过滤出结果为偶数的结果

[x * x for x in range(1, 11) if x % 2 == 0 ]


Out[2]:
[4, 16, 36, 64, 100]

In [3]:
# 可以在列表生成式中使用双重循环
# 输出一对元组,每个数在10以内,且加在一起等于5

list1 = [(x, y) for x in range(10) for y in range(10) if x + y == 5 if x > y]

print(list1)


[(3, 2), (4, 1), (5, 0)]

In [6]:
# 改进之前寻找目录下指定字母开头的文件的判断方式
# 修改为使用列表生成式

import os

# 可以判断各类情况,比如第一个是大写的 P 字母, 用列表生成式的方式,代码精简了很多
list1 =  [x for x in os.listdir('/Users/yijun') if x[0:1] == 'P']
print(list1)


['Pictures', 'PrintHood', 'PycharmProjects']

字典也可以用列表生成式生成

可以理解列表生成式的改变被泛化了,可以用类似的方法来生成字典。

zip() 函数用来把多个可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。所以像个拉链一样,将不同的可迭代对象装配起来。


In [20]:
# zip 对象没有办法直接显示其内容,因为它也是一个可迭代的对象

list1 = zip(range(5),'hello')
print(list1)


<zip object at 0x000001A0D718F848>

In [16]:
# 我们用循环来读取 zip 输出的内容

for k,v in zip(range(5),'hello'):
    print(k,v)


0 h
1 e
2 l
3 l
4 o

In [8]:
# 用列表生成式来生成字典

s = 'hello world'
dict1 = {k:v for (k,v) in zip(range(11),s)}
print(dict1)


{0: 'h', 1: 'e', 2: 'l', 3: 'l', 4: 'o', 5: ' ', 6: 'w', 7: 'o', 8: 'r', 9: 'l', 10: 'd'}

In [24]:
# 将矩阵降维

def list_flatten(matrix):
    return [x for row in matrix for x in row]

matrix = [range(0,5),range(5,10),range(10,15)]

print(matrix)

print(list_flatten(matrix))


[range(0, 5), range(5, 10), range(10, 15)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

In [22]:
# 也可以直接使用 dict() 类型转换,因为这里逻辑比较简单

dict1 = dict(zip(range(11),s))
print(dict1)


{0: 'h', 1: 'e', 2: 'l', 3: 'l', 4: 'o', 5: ' ', 6: 'w', 7: 'o', 8: 'r', 9: 'l', 10: 'd'}

思考一下

写一个程序,通过预先设定的后缀,将桌面上的文件自动归类到不同的文件夹,文件夹和后缀的关系是一对多的关系,可以自己定义。