欢迎访问宙启技术站
智能推送

使用Python的filter()函数过滤不符合条件的元素

发布时间:2023-06-20 00:18:05

在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中常用的高阶函数,对于处理序列数据非常有用。