赞
踩
经常会看到类似于 [i for i in range(1,10)]
的表达式,这种表达式称为列表解析(List Comprehensions),类似的还有字典解析、集合解析等等。
列表解析式是将一个列表(实际上适用于任何可迭代对象)转换成另一个列表的工具。在转换过程中,可以指定元素必须符合一定的条件,才能添加至新的列表中,这样每个元素都可以按需要进行转换。
每个列表解析式都可以重写为 for 循环,但不是每个 for 循环都能重写为列表解析式,列表解析比 for 更精简,运行更快。
[expression for iter_val in iterable]
[expression for iter_val in iterable if cond_expr]
举例说明,将 1-10 每个数乘以 2 放入一个列表:
用 for 循环实现如下:
>>> li = []
>>> for i in range(1, 11):
li.append(i*2)
>>> print(li)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
用列表解析式实现如下:
>>> li = [i*2 for i in range(1, 11)]
>>> print(li)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
此外列表解析式还支持添加筛选条件,例如筛选出 i*2>10
的数:
>>> li = [i*2 for i in range(1, 11) if i*2 > 10]
>>> print(li)
[12, 14, 16, 18, 20]
更复杂一点,嵌套循环也可以转换成列表解析式,先看一个普通的嵌套循环:
>>> li1 = ['A', 'B', 'C']
>>> li2 = ['1', '2', '3']
>>> li3 = []
>>> for m in li1:
for n in li2:
li3.append((m,n))
>>> print(li3)
[('A', '1'), ('A', '2'), ('A', '3'), ('B', '1'), ('B', '2'), ('B', '3'), ('C', '1'), ('C', '2'), ('C', '3')]
列表解析式实现如下:
>>> li1 = ['A', 'B', 'C']
>>> li2 = ['1', '2', '3']
>>> li3 = [(m,n) for m in li1 for n in li2]
>>> print(li3)
[('A', '1'), ('A', '2'), ('A', '3'), ('B', '1'), ('B', '2'), ('B', '3'), ('C', '1'), ('C', '2'), ('C', '3')]
普通 for 循环:
>>> a = {'language1':'python', 'language2':'java','language3':'c'}
>>> b = {}
>>> for key, value in a.items():
if key == 'language1':
b[key] = value
>>> print(b)
{'language1': 'python'}
用字典解析式实现如下:
>>> a = {'language1':'python', 'language2':'java','language3':'c'}
>>> b = {key: value for key, value in a.items() if key == 'language1'}
>>> print(b)
{'language1': 'python'}
普通 for 循环:
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> b = set() # 创建一个空集合
>>> for i in a:
if i > 5:
b.add(i)
>>> print(b)
{6, 7, 8, 9, 10}
用集合解析式实现如下:
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> b = {i for i in a if i > 5}
>>> print(b)
{6, 7, 8, 9, 10}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。