python基础知识分享:zip()、filter函数和reduce如何使用?

zip()函数

可以从一个或多个可迭代对象中并行取出元素进行并行的迭代。它也是返回自身的迭代器。

例如:

>>> L1 = ["one","two","three"]
>>> L2 = [1,2,3]

>>> zip(L1,L2)
<zip object at 0x000001AFDC2D9A08>
>>> list(zip(L1,L2))
[('one', 1), ('two', 2), ('three', 3)]

我是一名python开发工程师,整理了一套python的学习资料,从基础的python脚本到web开发、爬虫、
数据分析、数据可视化、机器学习、面试真题等。想要的可以进群:688244617免费领取!

之所以能并行迭代多个可迭代对象,是因为它同时标记多个可迭代对象的迭代位置。如果zip的多个可迭代对象的长度不同,则以最短的长度为标准,因为zip最多只能标记到最短长度的迭代位置。

因为zip返回的是迭代器,所以可以使用迭代工具去操作zip的结果:

>>> L1 = ["one","two","three"]
>>> L2 = [1,2,3]

>>> ("one",1) in zip(L1,L2)
True

>>> for (x,y) in zip(L1,L2):print(x,"-->",y)
...
one --> 1
two --> 2
three --> 3

zip常用于构建dict,因为它并行从多个迭代对象中取数据:

>>> L1 = ["one","two","three"]
>>> L2 = [1,2,3]

>>> dict(zip(L1,L2))
{'one': 1, 'two': 2, 'three': 3}

需要注意的是,zip可以从任意可迭代对象中取元素,而集合/字典中的元素顺序是不定的,所以并行取出来的顺序可能不像想象中在位置上那般一一对应。

>>> L1={"one","two","three"}
>>> L2=[1,2,3]
>>> list(zip(L1,L2))
[('one', 1), ('three', 2), ('two', 3)]

filter

Python中的filter函数类似于Perl中的grep,用于从可迭代对象中筛选出元素被函数操作后为True的元素。

filter(function or None, iterable) --> filter object

例如,筛选出列表中字符串元素长度大于2的字符串:

>>> L = ["a","ab","abc","abcd"]
>>> L1 = filter( (lambda x: len(x) > 2), L )
>>> print(list(L1))
['abc', 'abcd']

上面的工作过程是迭代列表L,每取一个元素都放进函数中操作一番,如果这个元素放进函数中使得函数返回真,则保留这个元素,否则丢弃这个元素。

如果filter的函数部分为None,则表示直接从可迭代对象中取出元素为True的元素:

>>> list(filter(None,["a","ab",0,"","c"]))
['a', 'ab', 'c']

filter的返回结果是一个可迭代对象,可以进行迭代操作:

>>> for i in filter( (lambda x: len(x) > 2), L ): print(i)
...
abc
abcd

reduce

reduce的功能非常好用,看下面的示例:

>>> import functools
>>> functools.reduce(lambda x, y: x+y, [1,2,3,4,5])
15

它的语法为:

reduce(func, sequence[, initial]) -> value

reduce有两个过程:

  1. 先从sequence中取两个元素作为func的参数,该函数返回一个结果A。这是初始化的过程
  2. 将结果A与sequence的下一个元素作为func的参数,继续返回一个结果B,将结果B与下一个元素作为func参数,依次类推,直到迭代完sequence中所有元素

如果给reduce设置了initial参数,则跳过初始化的过程,直接将Initial与sequence的第一个元素作为func的参数。如果没有给定sequence,而给了Initial,则initial作为直接返回的默认值。

例如,从序列中取出最大值:

>>> reduce( lambda x, y: x if x > y else y, [1,2,3,4,5] )
5

>>> reduce( lambda x, y: x if x>y else y, [1,2,3,4,5],10 )
10

觉得文章还不错的话不妨收藏起来慢慢看,有任何建议或看法欢迎大家在评论区分享讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值