列表解析即利用现有的可迭代对象创建新的列表的Python语法,其过程完全可以用for循环复刻,但其解析效率比for循环快一些,缺点也很明显,即不适合用于大数据迭代对象的解析,因为会占用大量内存,导致MemoryError。当然列表解析让人爱不释手的另一个原因就是简洁。
- L = [1, 2, 3, 4, 5]
- LL = [x ** 2 for x in L]
- [print(x) for x in LL]
- 复制代码
示例结果:
- 1
- 4
- 9
- 16
- 25
- 复制代码
示例中我们完成了对原列表元素每个值进行平方的操作,每个元素的平方结果构成了新的列表
- D = {
- 'one': 1,
- 'two': 2,
- 'three': 3,
- 'four': 4,
- 'five': 5
- }
- L = [D[key] ** 2 for key in D]
- [print(x) for x in L]
- 复制代码
- 1
- 4
- 9
- 16
- 25
- 复制代码
示例中我们利用列表解析获取字典的键值并对每个键值进行平方的操作,而每个键值的平方结果构成了新的列表
- S = '12345'
- L = [int(s) ** 2 for s in S]
- [print(x) for x in L]
- 复制代码
示例结果
- 1
- 4
- 9
- 16
- 25
- 复制代码
示例中我们利用列表解析获取字符串中单个字符串并且转为整型并进行平方和的操作,而每个平方后的结果构成了新的列表
- with open('ex.txt') as f:
- lines = f.readlines()
- LINES = [line.strip().title() for line in lines]
- [print(line) for line in LINES]
- 复制代码
- i like python.
- python makes me happy.
- without python, without live.
- 复制代码
示例中我们甚至可以利用列表解析读取文件中的数据
列表解析中的表达式(expr)可以是简单的或者复杂的表达式,甚至是函数,若在前面的例子中我们利用列表解析逐一打印了列表中的数据。
- def is_even(x):
- if x >= 0 and x % 2:
- return x, True
- else:
- return x, False
- L = [1, 2, 3, 4, 5]
- L_EVEN = [is_even(x) for x in L]
- print(L_EVEN)
- 复制代码
示例结果
- [(1, True), (2, False), (3, True), (4, False), (5, True)]
- 复制代码
在列表解析中我们也可以直接加入条件限制解析出的元素
- L = [1, 2, 3, 4, 5]
- L_EVEN = [x for x in L if x >= 0 and x % 2]
- [print(EVEN) for EVEN in L_EVEN]
- 复制代码
示例结果:
- 1
- 3
- 5
- 复制代码
列表解析也支持对迭代对象的多值解析
- D = {
- 'one': 1,
- 'two': 2,
- 'three': 3,
- 'four': 4,
- 'five': 5
- }
- L = ['{} = {}'.format(key, value) for (key, value) in D.items()]
- [print(x) for x in L]
- 复制代码
示例结果
- one = 1
- two = 2
- three = 3
- four = 4
- five = 5
- 复制代码
列表解析可以进行嵌套循环,原理和for中的嵌套循环一致
- L1 = ['a', 'b', 'c']
- L2 = ['1', '2', '3']
- L = [x+y for x in L1 for y in L2]
- [print(x) for x in L]
- 复制代码
示例结果
- a1
- a2
- a3
- b1
- b2
- b3
- c1
- c2
- c3
- 复制代码
转载于:https://juejin.im/post/5ce2acc66fb9a07eed34d211
联系客服