列表推导式
之前说的列表推导式是【每一个元素或者与该元素相关的操作 for 元素 in 可迭代对象】----遍历;
现在在来讲一种新的列表推导式,【满足条件的元素或者与该元素相关的操作 for 元素 In 可迭代对象 if 元素满足某种条件 】-----筛选
现在有一种需求:要求使用列表推导式生成一个列表,列表中的元素是0-30中可以被3整除的数:
L=[i for i in range(30) if i % 3==0] print(L)
其实很简单,就是在原来的基础上加一层if判断进行筛选,
运行结果:
那如果是想生成一个0-30之间可以被3整除的数的立方呢:
L=[i**3 for i in range(30) if i%3==0 ] print(L)
运行结果:
现在难度上升一下,有一个嵌套列表,要求输出名字里面含有2个e的名字(使用列表推导式)
names=[['Toms','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']] results=[name for i in names for name in i if name.count('e')==2] print(results)
运行结果:
对于这种嵌套的列表,如果想使用列表推导式作用于每一个元素,就得使用两层循环,需要注意外层循环写在前,内层循环写在后;
字典推导式
字典推导式和列表推导式很相近,就是所用的符号是{},里面不再是单一的元素,而是一个键值对的形式:
现在有一个需求,就是把字典中的键值对颠倒过来组成一个新的字典(使用字典推导式)
dict={'a':1,'b':2,'c':3} d={dict[k]:k for k in dict} print(d)
运行结果:
但是如果我们不仅需要把原来字典的键值对颠倒过来,还想把新的字典中的值(字符串组成)全部大写组成一个新字典在输出(使用字典推导式)
dict={'a':1,'b':2,'c':3} d={dict[k]:k.upper() for k in dict} print(d)
运行结果:
如果想把一个字典 {k由字母组成,value由数字组成} 中大小写对应的value值合并(相加),并且key全部大写输出:
dict={'a':10,'b':20,'c':30,'e':40,'B':10,'A':20,'X':100} d={key.upper():(dict.get(key.upper(),0)+dict.get(key.lower(),0))for key in dict} print(d)
运行结果:
这里与用到之前的dict.get(key,0)函数:字典dict中由key 就返回key对应的value,没有就返回默认值0:
dict={'a':100,'b':200} print(dict.get('b','字典中没有该键时返回的值')) print(dict.get('c','字典中没有该键时返回的值'))
运行结果:
集合推导式
集合推导式和列表推导式很像,就是括号不一样(列表推导式采用中括号【】,生成器表达式使用圆括号(),字典表达式采用花括号 {},里面含有键值对),该集合推导式采用花括号{}(与字典推导式不同的是,里面不放键值对,放的是普通元素)
只不过集合推导式可以对元素去重:
现有一个需求,需要对原列表中的元素取平方,然后去重:
lst=[1,-1,2,-2,3,4] set={i**2 for i in lst} #集合推导式可以去重 print(set) L=[i**2 for i in lst] print(L)
运行结果: