列表推导式是Python最受喜爱的特性之⼀。它允许⽤户⽅便的从⼀个集合过滤元素,形成列表,在传递参数的过程中还可以修改元素。
形式:
[expr for val in collection if condition]
等价于:
result=[]
for val in collection:
if condition:
result.append(expr)
例如:
strings =['a', 'as', 'bat', 'car', 'dove']
a=[x.upper() for x in strings if len(x)>2]
print(a)
执行结果:
['BAT', 'CAR', 'DOVE']
同理可以推导出字典和集合的推导式:
字典:
{key-expr:value-expr for value in collection if condition}
集合:
{expr for value in collection if condition}
要注意的是,在推导式中if condition可以看做一个过滤器,下面用一个集合推导式演示一下没有过滤器的情形。
strings=['a', 'as', 'bat', 'car', 'dove']
a={len(x) for x in strings}
print(a)
执行结果
{1,2,3,4}
这里可以用map函数达到相同效果:
a=set(map(len,strings))
print(a)
字典推导式的例子:
strings=['a', 'as', 'bat', 'car', 'dove']
loc_mapping = {val : index for index, val in enumerate(strings)}
print(loc_mapping)
执行结果:
{'a': 0, 'as': 1, 'bat': 2, 'car': 3, 'dove': 4}
p.s. enumerate()请查看python函数部分文章
嵌套列表推导式:
形式:
[x for y in collection for x in y if condition]
等价于:
result=[]
for y in collection:
for x in y:
if confition:
result.append(x)
看一个例子:
all_data = [['John', 'Emily', 'Michael', 'Mary', 'Steven'],
['Maria', 'Juan', 'Javier', 'Natalia', 'Pilar']]
result = [name for names in all_data for name in names
if name.count('e') >= 2]
print(result)
等价于:
result=[]
for names in all_data:
for name in names:
if name.count('e')>=2:
result.append(name)
print(result)
执行结果:
['Steven']