如题:
给定一个数组,其中该数组中的每个元素都为字符串,删除该数组中的空白字符串。
_list = ["A", "", "", "B", "", "C", "", "", "D", "", ' ']
根据廖大文章,答案是这样的:
1 def not_empty(s):
2 return s and s.strip()
3
4 print(list(filter(not_empty, _list)))
结果:
['A', 'B', 'C']
那么问题来了,
Why does “return s and s.strip()” work when using filter?
这其实是一道逻辑题(手动狗头)。听我娓娓道来。
先把涉及的知识点说下:
1. filter原理:
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象。
此函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数,
然后返回 True 或 False,最后将返回 True 的元素放到新列表中。 格式:filter(function, iterable)
2. python的and 返回值
>>> 'a' and 'b'
'b'
>>> '' and 'b'
''
>>> 'b' and ''
''
>>> 'a' and 'b' and 'c'
'c'
>>> '' and None and 'c'
''
在布尔上下文中从左到右演算表达式的值,如果布尔上下文中的所有值都为真,那么 and 返回最后一个值。
如果布尔上下文中的某个值为假,则 and 返回第一个假值。
3. strip()方法作用
去掉字符串前、后的空白字符 (即空格)
>>> print(" j d s fk ".strip())
j d s fk
注意听:return s and s.strip() 中的 s/s.strip() 如果是空字符串 ===》 它为假,根据and 返回值,s and s.strip() 一定返回第一个假值 ===》所以函数返回给filter() 为False,即此元素被过滤掉 ===》filter(返回 True 的元素放到新列表中),即新列表中存储的都是非空、非空格字符串。
也就是说 用filter()来过滤元素, 函数中 s去除的是空字符串,s.strip() 去除的是空格字符串。