介绍
Python内置的 filter()
函数可以用来从现有的 iterable 创建一个新的 iterator (如 list 或 dictionary),这将有效地过滤使用我们提供的函数的元素。
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()
几乎相同的结果,就像我们使用一个常规函数时一样。
使用None
与filter()
我们可以将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_creatures
和search_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 主题页面。