python的内置函数filter,map,zip

一:filter函数(筛选)

filter()函数:
   filter函数能够从可迭代对象(如字典、列表)中筛选某些元素,并生成一个新的迭代器。可迭代对象是一个可以被“遍历”的Python对象,也就是说,它将按顺序返回各元素,这样我们就可以在for循环中使用它。


语法是:
    function是调用过滤规则的函数名,iterable是要过滤的迭代器对象,
    filter(function, iterable)

filter函数的功能:
   规则匹配,就为真。意思就是筛选匹配的数据。

例子一:

方法1:

def names_vowels(x):
    if x[0].lower() in 'aeiou':
        return x


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

# creature_names这个列表会一个一个元素传递给names_vowels函数去处理,返回函数处理的值存入filtered_names,由于是creature_names是迭代器,因此存放到filtered_names,这个也是生成器器。可以使用__next__方法一个一个取。

filtered_names = filter(names_vowels, creature_names)

# 可以把filtered_names生成器器转化为列表的形式,生成器的本质其实也是迭代器,列表也是迭代器。
lst01 = list(filtered_names)
print(lst01)



结果:
['Ashley', 'Olly']

方法2:
# filter()中使用lambda函数的方法


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


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


结果:
['Ashley', 'Olly']
例子二:
  
方法1:

lst02 = ["周芷若", "周星驰", "周润发", "刘德华","张伯通", "周杰伦", "周洋拉拉"]


# lst02中的每个元素,只要是以周开头的,就筛选出这个元素,并且以生成器的存放方式
l2 = filter(lambda x: x.startswith("周"), lst02)

print(list(l2))


结果:
['周芷若', '周星驰', '周润发', '周杰伦', '周洋拉拉']


方法2:
# filter()中使用lambda函数的方法


lst02 = ["周芷若", "周星驰", "周润发", "刘德华","张伯通", "周杰伦", "周洋拉拉"]

l2 = filter(lambda x: x.startswith("周"), lst02)

# l2是生成器,获取可以从通过__next__()方法来分批提取数据。
print(l2.__next__())
print(l2.__next__())

#由于上面取了二次元素,因此下面元素要从第三次,然后第三次以后所有的筛选出来的元素转换成列表
print(list(l2))


结果:

周芷若
周星驰
['周润发', '周杰伦', '周洋拉拉']


总结:
    在filter()函数中,使用lambda函数得到的结果与使用常规函数得到的结果相同。如果所要过滤数据更复杂了,还可能要使用正则表达式,这可能会提高代码的可读性。

二:map函数(映射)

map函数

例子一:
# 使用 Python map 函数将字符串列表转换为整数列表:
list_of_strings = ["5","6","7","8","9", "10"]

result = map(int,list_of_strings)

print(list(result))

输出:
[5, 6, 7, 8, 9, 10]

--------------------------------------------------------------------------------------

语法:
map(insert function here, insert iterable here)

详解原理:

map() :
    只是 Python map 函数的名称,没什么特别的。

insert function here: 
    是你将在函数中写入的空间。在上面的代码示例中,我们使用了 int 函数。我们可以使用另一个内置函数,如 len() ,或者我们可以构建自己的函数并在这里也使用它。

insert iterable here:
     是你将在你选择的可迭代项目中写入的空间。在本例中,我们插入了列表(list_of_strings)。

result:
    是我们存储新转换项目的变量。

让我们转到最后一行代码。同样,它将从内而外执行:

print(list(result))
list() 接收我们新转换的可迭代项,并告诉我们的计算机这些项是列表的一部分。

-----------------------------------------------------------------------------------------
例子二:
# 使用lambda函数

lst03 = [1, 2, 3, 4, 5, 6]

# 冒号前面的含义,比如 item: item * item,冒号前面item是迭代器lst03会一个一个这样传入,传入一个后,冒号后面item * item进行规则换算得出结果返回ls,ls这里是生成器,也是迭代器。
ls = map(lambda item: item * item, lst03)

result = list(ls)

#把上面的生成器以list的形式全部显示出来,否则就是一次取一个元素。
print(result)


结果:
[1, 4, 9, 16, 25, 36]


总结:
    Python map 函数不是遍历字符串列表的每个元素,而是将整个字符串列表转换为数字列表。你节省了内存,并且代码运行得更快。

三:zip函数

zip() 函数

作用:
    将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。我们可以使用 list() 转换来输出列表。

注意:
    如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。


例子一:

dict_one = {'name': 'John', 'last_name': 'Doe', 'job': 'Python Consultant'}
dict_two = {'name': 'Jane', 'last_name': 'Doe', 'job': 'Community Manager'}


# 将某个字典的键值对合并为一个元组。
for (k1, v1), (k2, v2) in zip(dict_one.items(), dict_two.items()):
    print(k1, '->', v1)
    print(k2, '->', v2)


#结果:
name -> John
name -> Jane
last_name -> Doe
last_name -> Doe
job -> Python Consultant
job -> Community Manager


例子二:
total_sales = [52000.00, 51000.00, 48000.00]
prod_cost = [46800.00, 45900.00, 43200.00]

for sales, costs in zip(total_sales, prod_cost):
	profit = sales - costs
	print(f'Total profit: {profit}')


结果:
Total profit: 5200.0
Total profit: 5100.0
Total profit: 4800.0

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值