列表生成式


[含有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】

此篇记录参考了一位博主的笔记。感谢博主笔记!