使用Python的filter()函数过滤不符合条件的元素
在Python中,filter()是一个内置函数,能够根据指定的条件或者函数来过滤一个序列(列表、元组、字典、集合等)。通俗地说,filter()函数就像一个筛子,只让符合条件的元素通过,不符合条件的元素则被过滤掉。
filter()函数的语法如下:
filter(function, iterable)
其中,function参数表示用于过滤的函数,iterable参数表示要过滤的序列。
在function函数中,对于每个元素,如果返回的结果为True,则该元素会被保留下来;如果返回的结果为False,则该元素会被过滤掉。如果function参数为空,则默认判断元素是否为真值。
下面我们通过几个例子来看一下filter()函数的使用。
### 过滤整数序列中的偶数
假设我们有一个整数序列,我们想要过滤出其中的偶数。可以使用如下的代码:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def is_even(n):
return n % 2 == 0
filtered_numbers = list(filter(is_even, numbers))
print(filtered_numbers) # [2, 4, 6, 8, 10]
在上面的代码中,我们首先定义了一个序列numbers和一个用于过滤的函数is_even()。该函数接受一个整数参数n,如果n是偶数(即它可以被2整除),则返回True;否则,返回False。
接着,我们使用filter(is_even, numbers)来过滤序列numbers中的元素。filter()函数返回一个迭代器对象,该对象包含了所有返回True的元素。最后,我们使用list()函数将迭代器转换为列表,并将结果存储在filtered_numbers中。
最终,我们得到了一个只包含偶数的列表。
### 过滤字符串列表中长度大于5的字符串
假设我们有一个字符串列表,我们想要过滤出其中长度大于5的字符串。可以使用如下的代码:
words = ['apple', 'banana', 'kiwi', 'watermelon', 'pear', 'orange']
def is_long(word):
return len(word) > 5
filtered_words = list(filter(is_long, words))
print(filtered_words) # ['watermelon', 'orange']
在上面的代码中,我们首先定义了一个字符串列表words和一个用于过滤的函数is_long()。该函数接受一个字符串参数word,如果word的长度大于5,则返回True;否则,返回False。
接着,我们使用filter(is_long, words)来过滤字符串列表words中的元素。filter()函数返回一个迭代器对象,该对象包含了所有返回True的元素。最后,我们使用list()函数将迭代器转换为列表,并将结果存储在filtered_words中。
最终,我们得到了一个只包含长度大于5的字符串的列表。
### 使用lambda表达式过滤列表中的负数
假设我们有一个列表,我们想要过滤出其中的负数。由于这个过滤条件比较简单,我们可以使用lambda表达式来定义一个匿名函数,不需要定义一个具名函数。
下面是代码:
numbers = [-4, 5, 2, -3, 6, -1] filtered_numbers = list(filter(lambda x: x >= 0, numbers)) print(filtered_numbers) # [5, 2, 6]
在上面的代码中,我们使用lambda表达式来定义一个匿名函数,该函数接受一个整数参数x,如果x大于等于0,则返回True;否则,返回False。我们将这个lambda表达式作为filter()函数的 个参数,过滤列表numbers中的元素。
最终,我们得到了一个只包含非负整数的列表。
### 总结
以上三个例子展示了如何使用filter()函数过滤不符合条件的元素。使用filter()函数可以让代码更简洁、更易读,并且能够提高代码的可维护性。同样,我们还可以使用map()函数对序列进行映射,或者使用reduce()函数对序列进行累积计算。这些函数都是Python中常用的高阶函数,对于处理序列数据非常有用。
