详解Python中的 zip、zip(*)、map、reduce
2020-08-21 本文已影响0人
超级超级小天才
其他关于Python的总结文章请访问:https://www.jianshu.com/nb/47435944
详解Python中的 zip、zip(*)、map、reduce、filter
zip和zip(*)
zip()
函数接受(零个)、一个、多个可迭代对象(iterable
)为参数,将这些 iterable
合并成一个tuple
,返回一个对象,可以使用 list
将返回的 zip
对象转换成列表,列表的长度是所有传入的 iterable
对象中可迭代最短的个数
zip(*)
是 zip
的逆过程,可以将一个 zip
对象返回成多个 iterable
对象,返回的结果依然可以使用 list
转换成列表
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, 10, 11]
zip1 = zip(a,b)
print(zip1)
print(list(zip1))
zip2 = zip(a,b,c)
print(list(zip2))
[a1, b1] = zip(*zip1)
print(list(a1))
------
<zip object at 0x103abc288>
[(1, 4), (2, 5), (3, 6)]
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
[1, 2, 3]
map和reduce
map
函数接受两个参数,一个是一个函数,另一个是一个可迭代对象(iterable
),map
将该函数依次作用给可迭代对象中的每一个元素,然后返回的结果再封装成一个迭代器(iterator
)
def f(x):
return x**2
s = map(f,range(10))
print(s)
print(list(s))
<map object at 0x000001D8D906DD48>
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
·
reduce函数需要从
functools` 包中引入:
from functools import reduce
reduce
接受的参数和 map
一样,不同的作用是 reduce
是依次根据传入的可迭代对象的每个元素,然后把每一次的结果跟下一个元素进行计算,也就是说他的效果是这样的:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
比如一个很经典的结合 map
和 reduce
一起使用的例子是将一个纯数字的 string
变成 int
值:
from functools import reduce
def f(x,y):
return x*10 + y
def g(c):
digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
return digits[c]
a = reduce(f,map(g,'13579'))
print(a)
print(type(a))
------
13579
<class 'int'>
filter函数
filter
函数和 map
类似,但是 filter
是根据所接收的那个函数的返回结果是 True
还是 False
来筛选传入的那个可迭代对象中的元素,如果该函数作用在一个元素上时返回的是 True
,那么这个元素也会出现在返回的结果中,反之就不会被返回:
def isOdd(a):
return a%2 == 1
print(list(filter(isOdd, [1,2,3,4,5,6,7,8,9])))
------
[1, 3, 5, 7, 9]