列表解析是将一个列表转换为另一个列表的工具。在转换的过程中,可以指定元素必须符合一定的条件,才能添加到新的列表中,这样每个元素都可以按需要进行转换。
列表解析可以看做结合了 filter函数与map函数功能的语法:
double_odds = map(lambda n: n*2, filter(lambda n: n%2==1, numbers))
double_odds = [n*2 for n in numbers if n%2 == 1]
======================================================================================
1. 从循环到列表解析式
每个列表解析式都可以重写为for循环,但是不是每个for循环都可以写成列表解析式
new_things = []
for item in list:
if condition_based_on(item)
new_things = new_things.append('I have ' + item)
上面的便可以写成
new_things = ['I have '+ item for item in list if condition_based_on(item)]
======================================================================================
2. 无条件的列表解析式
如果是没有if... 部分的代码,会更好实现
numbers_new = []
for n in number_old:
numbers_new.append(n*2)
上面的便可以写成
numbers_new = [n*2 for n in number_old]
=======================================================================================
3. 嵌套循环
例如一个拉平矩阵(flatten功能)的for循环:
flattened = []
for row in matrix:
for n in row:
flattened.append(n)
上面的便可以写成
flattened = [n for row in matrix for n in row]
=======================================================================================
4. 其他解析式
4.1 集合解析式:
例如提取每个单词的首字母,创建一个集合set:
first_letters = set()
for w in words:
first_letters.add(w[0])
等于
first_letters = [w[0] for w in words]
4.2 字典解析式:
例如将原有字典的键值互换,从而创建一个新的字典
flipped = {}
for key,value in original.items():
flipped[value] = key
flipped = {value: key for key, value in original.items()}