当我们需要按照条件过滤列表中的一些元素时,可以使用Python内置的filter()
函数,不过它只是筛选元素,并不能对筛选后的结果进行进一步的操作。为了更进一步地筛选以及对筛选结果进行操作,Python提供了compress()
函数。
compress()
函数接受两个可迭代对象,一个为数据序列,另一个为包含布尔值的筛选序列,最终返回一个只包含筛选序列为True对应元素的迭代器。
使用方法:
from itertools import compress
list_a = [1, 2, 3, 4, 5]
selector = [True, False, True, False, True]
result = compress(list_a, selector)
print(list(result))
上面的代码为根据布尔筛选序列,过滤数据列表,这里的结果为:[1, 3, 5]。也就是只有在筛选序列为True时的数据才会被返回。
另外,compress()
函数的筛选序列的长度应该和数据序列的长度相同,不然会引发ValueError。
示例一:以字典为数据源,选择字典中值为偶数的元素,并输出它们的键值对。
from itertools import compress
dict_a = {"a":1, "b":2, "c":3, "d":4, "e":5}
selector = [value % 2 == 0 for value in dict_a.values()]
filtered_dict = dict(compress(dict_a.items(), selector))
print(filtered_dict)
上述代码中,我们先遍历字典的所有值,然后生成筛选序列selector,最后通过compress()
函数筛选出值为偶数的键值对,最终返回一个新字典。
示例二:以列表为数据源,选择列表中长度大于等于3且第一个字母为”a”的字符串,并输出它们
from itertools import compress
list_a = ["apple", "banana", "avocado", "pear", "apricot"]
selector = [(len(str) >= 3) and (str[0] == "a") for str in list_a]
filtered_list = list(compress(list_a, selector))
print(filtered_list)
上述代码中,我们先遍历列表中的所有字符串,将满足条件的字符串对应筛选序列置为True,最终筛选出符合条件的字符串并返回。注意:compress()
函数返回值是生成器,所以我们需要将生成器转化成列表。