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有两个过程:
- 先从sequence中取两个元素作为func的参数,该函数返回一个结果A。这是初始化的过程
- 将结果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
觉得文章还不错的话不妨收藏起来慢慢看,有任何建议或看法欢迎大家在评论区分享讨论!