filter()函数的简介和语法:

filter()函数用于过滤序列,过滤掉不符合条件的元素,返回符合条件的元素组成新列表。

filter()语法如下:

filter(function,iterable)

function -- 判断函数。
iterable -- 可迭代对象

序列中的每个元素作为参数传递给函数进行判断,
返回True或者False,最后将返回True的元素放到新列表中

filter()用法实例:

筛选出序列中为奇数的元素:

def is_odd(n):
    return n%2 == 1
lst1 = filter(is_odd,[1,2,3,4,5,6,7,8,9,10])
 
# lst = [1,3,5,7,9]

filter()经常和lambda一起用:

栗子1: 过滤掉列表当中的数字0

list_num = [1, 2, 3, 0, 8, 0, 3]
print(list(filter(lambda x: x, list_num)))

结果为: 
[1, 2, 3, 8, 3]

栗子2:过滤列表中数字的大小写(针对的是字母全都是大写或小写的情况)

list_word = ['a', 'B', 'c', 'd', 'E']
print(list(filter(lambda x: x.isupper(), list_word)))
print(list(filter(lambda x: x.islower(), list_word)))

结果为:
['B', 'E']
['a', 'c', 'd']

迭代器仅可使用一次的问题

和map一样,filter函数在Python3中返回一个惰性计算的filter对象或迭代器。我们不能通过index访问filter对象的元素,也不能使用len()得到它的长度。

def is_odd(n):
    return n % 2 == 1
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist)
print(list(newlist))
print(list(newlist))

输出结果为:
<filter object at 0x7fba80a8d630>
[1, 3, 5, 7, 9]
[]

规避这个惰性计算的问题,赋值的时候直接用list进行转换一下:

不使用list转换

def is_odd(n):
    return n % 2 == 1

# 不使用list转换 
print("惰性计算")  
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(list(newlist))
for i in newlist:
    print(i,end = " ")
print(list(newlist))
输出结果
惰性计算
[1, 3, 5, 7, 9]
[]

不使用list转换

def is_odd(n):
    return n % 2 == 1

#不使用list转换 
print("规避惰性计算")
newlist = list(filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
print(newlist)
for i in newlist:
    print(i,end = " ")
print(newlist)

输出结果:
规避惰性计算
[1, 3, 5, 7, 9]
1 3 5 7 9 [1, 3, 5, 7, 9]

例子4:与dict构成的列表处理例子

dict_a = [{'name': 'python', 'points': 10}, {'name': 'java', 'points': 8}]
test_filter = filter(lambda x : x['name'] == 'python', dict_a)
print(list(test_filter))

输出结果:
[{'name': 'python', 'points': 10}]
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐