列表生成式
[含有x的表达式 for x in 迭代 if条件(可选)]
对于for...in循环当中,如果每一次if条件都满足时,就可以执行含有x的表达式。利用if来筛选出想要的结果。
练习:利用内建函数判断是否是字符串
如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()
方法,所以列表生成式会报错。
使用内建的isinstance
函数可以判断一个变量是不是字符串。
请修改列表生成式,通过添加if
语句保证列表生成式能正确地执行:
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 =
希望看到的输出:
['hello', 'world', 'apple']
【分析】
题目要求是将L1列表中的18,None去掉(这个说法不太好),或者说是将字符串保留,并且转化成小写。既然要进行筛选,那么需要用到if条件。根据列表生成式,首先要遍历L1列表中的每个元素进行判断for x in L1,然后进行筛选是否是字符串if isinstance(x, str),最后执行表达式x.lower()
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 = [x.lower() for x in L1 if isinstance(x, str)]
print(L2)
【拓展】
1.想让L2列表中保留18和None,并对字符串做小写改变。
列表生成式中,含有x的表达式,可以写作为一个函数表达式,f(x) for x in L1。
而这个函数表达式中包含你想进行筛选的条件,这样就可以对L1中所有元素都进行处理,然后根据函数表达式中的条件返回不同的结果。
def f(x):
if isinstance(x, str):
return x.lower()
elif x is None:
return 0
else:
return x
L3 = [f(s) for s in L1]
print(L3)
同样,也可以使用列表生成式。
L4 = [x.lower() if isinstance(x, str) else x for x in L1 ]
print(L4)
此处 if isinstance(x, str) else x, 在for ...in中遍历每个x,对x进行判断,如果x是字符串则执行x.lower表达式,否则x不执行表达式,没有做任何改变,直接保留下来。
if + 条件在此处情形中放在了for...in的前面!
或者这样理解:一般 if 为真时,再执行后面的语句,然而这里,if 为真时,执行的x.lower表达式放在了 if 前面。
2.若果把字符串变成小写,使None变为0
L4 = [x.lower() if isinstance(x, str) else 0 if x is None else x for x in L1]
print(L4)
首先判断x是否为字符串,若果是,执行x.lower;如果为假,进入第二个 if ,并判断,若为真,执行else 0,若为假,执行else x。
【PS】
此篇记录参考了一位博主的笔记。感谢博主笔记!