列表推导式是Python最受喜好的特性之一。它容许用户方便的从一个集合过滤元素,造成列表,在传递参数的过程当中还能够修改元素。形式以下:python
[expr for val in collection if condition]
它等同于下面的for循环;app
result = [] for val in collection: if condition: result.append(expr)
filter条件能够被忽略,只留下表达式就行。例如,给定一个字符串列表,咱们能够过滤出长度在2及如下的字符串,并将其转换成大写:函数
In [154]: strings = ['a', 'as', 'bat', 'car', 'dove', 'python'] In [155]: [x.upper() for x in strings if len(x) > 2] Out[155]: ['BAT', 'CAR', 'DOVE', 'PYTHON']
用类似的方法,还能够推导集合和字典。字典的推导式以下所示:spa
dict_comp = {key-expr : value-expr for value in collection if condition}
集合的推导式与列表很像,只不过用的是尖括号:rest
set_comp = {expr for value in collection if condition}
与列表推导式相似,集合与字典的推导也很方便,并且使代码的读写都很容易。来看前面的字符串列表。假如咱们只想要字符串的长度,用集合推导式的方法很是方便:code
In [156]: unique_lengths = {len(x) for x in strings} In [157]: unique_lengths Out[157]: {1, 2, 3, 4, 6}
map
函数能够进一步简化:字符串
In [158]: set(map(len, strings)) Out[158]: {1, 2, 3, 4, 6}
做为一个字典推导式的例子,咱们能够建立一个字符串的查找映射表以肯定它在列表中的位置:string
In [159]: loc_mapping = {val : index for index, val in enumerate(strings)} In [160]: loc_mapping Out[160]: {'a': 0, 'as': 1, 'bat': 2, 'car': 3, 'dove': 4, 'python': 5}
假设咱们有一个包含列表的列表,包含了一些英文名和西班牙名:it
In [161]: all_data = [['John', 'Emily', 'Michael', 'Mary', 'Steven'], .....: ['Maria', 'Juan', 'Javier', 'Natalia', 'Pilar']]
你多是从一些文件获得的这些名字,而后想按照语言进行分类。如今假设咱们想用一个列表包含全部的名字,这些名字中包含两个或更多的e。能够用for循环来作:io
names_of_interest = [] for names in all_data: enough_es = [name for name in names if name.count('e') >= 2] names_of_interest.extend(enough_es)
能够用嵌套列表推导式的方法,将这些写在一块儿,以下所示:
In [162]: result = [name for names in all_data for name in names .....: if name.count('e') >= 2] In [163]: result Out[163]: ['Steven']
嵌套列表推导式看起来有些复杂。列表推导式的for部分是根据嵌套的顺序,过滤条件仍是放在最后。下面是另外一个例子,咱们将一个整数元组的列表扁平化成了一个整数列表:
In [164]: some_tuples = [(1, 2, 3), (4, 5, 6), (7, 8, 9)] In [165]: flattened = [x for tup in some_tuples for x in tup] In [166]: flattened Out[166]: [1, 2, 3, 4, 5, 6, 7, 8, 9]
记住,for表达式的顺序是与嵌套for循环的顺序同样(而不是列表推导式的顺序):
flattened = [] for tup in some_tuples: for x in tup: flattened.append(x)
你能够有任意多级别的嵌套,可是若是你有两三个以上的嵌套,你就应该考虑下代码可读性的问题了。分辨列表推导式的列表推导式中的语法也是很重要的:
In [167]: [[x for x in tup] for tup in some_tuples] Out[167]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
这段代码产生了一个列表的列表,而不是扁平化的只包含元素的列表。