如何使用 Python 过滤器函数

介绍

Python内置的 filter() 函数可以用来从现有的 iterable 创建一个新的 iterator (如 listdictionary),这将有效地过滤使用我们提供的函数的元素。

filter()函数的基本语法是:

1filter(function, iterable)

这会返回一个过滤对象,这是一个可迭代的对象,我们可以使用一个函数,例如‘list()’来列出一个过滤对象中返回的所有项目。

例如,一个列表理解会创建一个新列表,这将增加该处理的运行时间,这意味着在我们的列表理解完成表达后,我们将有两个列表在记忆中。然而,‘filter()’会创建一个简单的对象,其中包含原始列表的参考,提供的函数,以及原始列表中去哪里的索引,这将消耗更少的记忆。

在本教程中,我们将审查使用 filter() 的四种不同的方法:有两种不同的可迭代结构,有 lambda 函数,并且没有定义的函数。

使用 filter() 与一个函数

至于 filter() 的第一个参数是 函数,我们使用它来决定是否包括或过滤每个项目. 该函数被称为第二个参数,并且每次返回 False 时,该值就会下降. 由于这个参数是一个函数,我们可以通过一个正常的函数,或者我们可以使用 lambda 函数,特别是当表达式不那么复杂时。

以下是一个lambda的语法,其中有filter():

1filter(lambda item: item[] expression, iterable)

通过列表,如下,我们可以将一个lambda函数与一个表达式相结合,我们希望对列表中的每个项目进行评估:

1creature_names = ['Sammy', 'Ashley', 'Jo', 'Olly', 'Jackie', 'Charlie']

为了过滤这个列表,以找到以语音开始的水族馆生物的名字,我们可以运行以下lambda函数:

1print(list(filter(lambda x: x[0].lower() in 'aeiou', creature_names)))

在这里,我们声明我们列表中的一个项目为x。然后我们将我们的表达式设置为访问每个字符串的第一个字符(或字符zero),因此x[0]

最后,我们通过可迭代的 creature_names. 就像上一节一样,我们将 list() 应用到结果中,以便从迭代器 filter() 返回一个列表。

产出将如下:

1[secondary_label Output]
2['Ashley', 'Olly']

同样的结果可以通过我们定义的函数来实现:

1creature_names = ['Sammy', 'Ashley', 'Jo', 'Olly', 'Jackie', 'Charlie']
2
3def names_vowels(x):
4  return x[0].lower() in 'aeiou'
5
6filtered_names = filter(names_vowels, creature_names)
7
8print(list(filtered_names))

我们的names_vowels函数定义了我们将执行过滤creature_names的表达式。

再次,产出将如下:

1[secondary_label Output]
2['Ashley', 'Olly']

总体而言,lambda函数与filter()几乎相同的结果,就像我们使用一个常规函数时一样。

使用Nonefilter()

我们可以将None作为第一个参数传递给filter(),以便返回的迭代器过滤任何 Python 认为是假的值。

在下面的情况下,我们想过滤我们的列表,只显示我们水族馆的坦克号码:

1aquarium_tanks = [11, False, 18, 21, "", 12, 34, 0, [], {}]

在这个代码中,我们有一个包含 整数,空序列和 boolean 值的列表。

1filtered_tanks = filter(None, aquarium_tanks)

我们使用filter()函数与None并通过aquarium_tanks列表作为我们的可重复性. 由于我们已经通过None作为第一个参数,我们将检查我们列表中的项目是否被认为是假的。

1print(list(filtered_tanks))

然后我们将‘filtered_tanks’包装到‘list()’函数中,以便在我们打印时返回‘filtered_tanks’的列表。

在这里,输出只显示整数. 所有评估为的项目,其长度等于0,都被过滤()删除:

1[secondary_label Output]
2[11, 25, 18, 21, 12, 34]

<$>[注意] 注意:如果我们不使用‘list()’并打印‘filtered_tanks’,我们会收到一个过滤对象,如下: <filter object at 0x7fafd5903240>

没有中,我们使用了过滤()来快速从我们的列表中删除被认为是假的项目。

使用字典列表的 filter()

例如,如果我们有一个字典列表,我们不仅要重复列表中的每一个项目 - 字典中的一个 - 但我们也可以重复字典中的每个键:值对以评估所有数据。

举个例子,让我们假设我们在我们的水族馆里有每个生物的列表,以及关于每个生物的不同细节:

1aquarium_creatures = [
2  {"name": "sammy", "species": "shark", "tank number": "11", "type": "fish"},
3  {"name": "ashley", "species": "crab", "tank number": "25", "type": "shellfish"},
4  {"name": "jo", "species": "guppy", "tank number": "18", "type": "fish"},
5  {"name": "jackie", "species": "lobster", "tank number": "21", "type": "shellfish"},
6  {"name": "charlie", "species": "clownfish", "tank number": "12", "type": "fish"},
7  {"name": "olly", "species": "green turtle", "tank number": "34", "type": "turtle"}
8]

我们希望通过我们给函数的搜索字符串来过滤这些数据. 为了让‘filter()’访问字典中的每个词典和每个项目,我们构建了一个嵌入式函数,如下:

1def filter_set(aquarium_creatures, search_string):
2    def iterator_func(x):
3    	for v in x.values():
4    		if search_string in v:
5    			return True
6    	return False
7    return filter(iterator_func, aquarium_creatures)

我们定义一个filter_set()函数,将aquarium_creaturessearch_string作为参数。在filter_set()中,我们将我们的iterator_func()作为函数传递给filter()

iterator_func()x作为一个参数,它代表了我们列表中的一个项目(即一个单一的字典)。

接下来,for循环访问我们的字典中的每个键:值对中的值,然后使用一个条件语句来检查search_string是否在v,代表一个值。

与我们之前的例子一样,如果表达式评估为,则函数会将项目添加到过滤对象中,这会在filter_set()函数完成后返回。

我们将filter_set()称为我们的字典列表和我们想要找到匹配的搜索字符串:

1filtered_records = filter_set(aquarium_creatures, "2")

一旦函数完成,我们将我们的过滤对象存储在‘filtered_records’变量中,我们将其转化为列表并打印:

1print(list(filtered_records))

我们将从这个程序中获得以下输出:

1[secondary_label Output]
2[{'name': 'ashley', 'species': 'crab', 'tank number': '25', 'type': 'shellfish'}, {'name': 'jackie', 'species': 'lobster', 'tank number': '21', 'type': 'shellfish'}, {'name': 'charlie', 'species': 'clownfish', 'tank number': '12', 'type': 'fish'}]

我们用搜索字符串2过滤了字典列表,我们可以看到包含2字符串的三个字符串被返回,使用我们自己的嵌入式函数使我们能够访问每个项目,并有效地检查每个对搜索字符串。

结论

在本教程中,我们了解了在Python中使用filter()函数的不同方法,现在您可以使用filter()与自己的函数、一个lambda函数或None来过滤数据结构的不同复杂度的项目。

虽然在本教程中,我们立即在列表格式中打印了从 filter() 的结果,但很可能在我们的程序中,我们会使用返回的 filter() 对象并进一步操纵数据。

如果您想了解更多 Python,请参阅我们的 如何在 Python 中编码 3]系列和我们的 Python 主题页面

Published At
Categories with 技术
comments powered by Disqus