1、列表推导式
_列表推导式_是最受欢迎的python语言特性之一。它允许你过滤一个容器的元素,用一种简明的表达式转换传递给过滤器的元素,从而生成一个新的列表。
列表推导式的基本形态为:
[expr for val in collection if condition]
过滤条件是可以忽略的,只保留表达式。例如,给定一个字符串列表,我们可以过滤出长度大于2的,并且将字母改为大写:
strings = ['a','as','bat','car','dove','pyton']
[x.upper()for x in strings if len(x) > 2]
['BAT', 'CAR', 'DOVE', 'PYTON']
这与下面的for循环是等价的:
strings = ['a','as','bat','car','dove','pyton']
a=[]
for x in strings:
if len(x) > 2:
a.append(x.upper())
a
['BAT', 'CAR', 'DOVE', 'PYTON']
2、集合与字典的推导式
集合与字典的推导式是列表推导式的自然拓展,用相似的方式生成集合与字典。
字典推导式:
dict_comp = {key-exper : value-expr for value in collection if comdition}
而集合推导式看起来很像列表推导式,只是中括号变成了大括号:
set_comp = {expr for value in collection if condition}
和列表推导式类似。集合、字典的推导式非常方便,它们使代码更易读易写。如果有一个字符串的列表,假设我们想要一个集合,集合里包含列表中字符串的长度,我可以通过集合推导式很方便的实现:
lengths = {len(x) for x in strings }
lengths
{1, 2, 3, 4, 5}
也可以使用map函数更加简洁的表达:
set(map(len,strings))
{1, 2, 3, 4, 5}
关于字典推导式,我们可以创建一个将字符串与其位置相匹配的字典作为字典推导式的简单示例:
dict = {val:index for index,val in enumerate(strings)}
dict
{'a': 0, 'as': 1, 'bat': 2, 'car': 3, 'dove': 4, 'pyton': 5}
3、嵌套列表推导式
假设我们有一个包含列表的列表,内容是两组名字:
data = [['John','Emily','Michael','Mary','Steven'],
['Maria','Juan','Javier','Natalia','Pilar']]
如果我们想要获得一个列表内包含所有含有2个以上字母e的名字,我们可以简单的使用for循环:
e_names = []
for names in data:
e_enough = [name for name in names if name.count('e') >= 2]
e_names.extend(e_enough)
e_names
['Steven']
实际上,我们也可以将整个操作用于一个嵌套列表推导式来完成:
result = [name for names in data for name in names
if name.count('e')>= 2]
result
['Steven']
当然,嵌套列表推导式可能会让你有点晕头转向。但是你需要明白的是列表推导式的for循环部分是根据嵌套的顺序排列的,所有的过滤条件像之前一样被放在尾部。下列是将含有整数元组的列表扁平化为一个简单的整数列表:
tuples = [(1,2,3),(4,5,6),(7,8,9)]
a_tuples = [x for tup in tuples for x in tup]
a_tuples
[1, 2, 3, 4, 5, 6, 7, 8, 9]
请牢记for表达式的顺序应当和你写嵌套for循环来替代列表推导式的顺序一致:
b_tuples = []
for tup in tuples:
for x in tup:
b_tuples.append(x)
b_tuples
[1, 2, 3, 4, 5, 6, 7, 8, 9]
你可以嵌套多层的列表推导式,但是超过两到三层之后可能会不利于代码的可读性。嵌套推导式的语法要和列表推导式中的列表推导式区分开,列表推导式中的列表推导式也是非常有效的:
[[x for x in tup]for tup in tuples]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
上面的代码创建了一个包含列表的列表,而不是所有内容元素扁平排列。