列表推导(List Comprehension)是在一些编程语言中存在的一种语法,目的是从一个存在的列表创建另一个列表。最便于理解这种语法的方法是来看看它的来源——集合的构建式表示法。请看以下的集合表达式:
其中的N是自然数集合,则集合S是由平方大于3的自然数乘以2组成的,这其中N是已存在的集合,x平方大于3是过滤条件,而2乘以x是产生新元素的表达式。下面来看一下Python中列表推导的语法:
[myExpression for myVar in myList if myPredicateExpression]
是否看得出来和集合的构建表达式很像?其中myList式已存在的列表,myPredicateExpression是过滤条件,而myExpression是产生新元素的表达式,if myPredicateExpression是可选项。来看两个简单的例子:
In [14]: [x for x in ["a", "b", "c"]] Out[14]: ['a', 'b', 'c'] In [15]: [x**3 for x in range(10) if x%2==1] Out[15]: [1, 27, 125, 343, 729]
灵活使用列表推导以后,可以显著简化一些代码,请看以下一些例子:
例1:从一个英文文件中读入所有的行并分词
with open('file.txt') as f: words = [l.strip().split(" ") for l in f.readlines() if len(l.strip()) > 0]
执行后将生成一个二维数组,内层数组的元素为分好的单词
例2:Jewels and Stones问题
class Solution: def numJewelsInStones(self, J, S): setJ = set(J) return sum(c in setJ for c in S)
参考资料
https://en.wikipedia.org/wiki/List_comprehension
https://leetcode.com/problems/jewels-and-stones/description/
https://www.oschina.net/translate/list_comprehension?lang=eng
https://stackoverflow.com/questions/3277503/in-python-how-do-i-read-a-file-line-by-line-into-a-list