Python Map函数—pythonic方法
1、计算1+2+3+…+n的值
方法一:
a=0
for i in range(101):
a+=i
print(a)
方法二:
print(list(map(lambda *x:sum(x),*[[x] for x in range(101)])))
执行结果:
5050
[5050]
这个粒子用map麻烦了些:看下一个粒子:
让二维数组的第一行里每个数据向列的方向依次相加后得到的值组成新数组[(25+4+61+36+0),…(32+11+76+33+4)].
你可能会想到用for循环依次取出相加,但或许有更好的办法。
a=[
[25, 29, 26, 33, 32, 18, 32],
[4, 4, 7, 8, 4, 6, 11],
[61, 41, 55, 46, 58, 29, 76],
[36, 35, 30, 35, 28, 27, 33],
[0, 3, 2, 2, 2, 0, 4]
]
print(list(map(lambda *x: sum(x),*a)))
执行结果:
[126, 112, 120, 124, 124, 80, 156]
解释一下上面源理:
参数是多参数的意思、不定数量参数的意思。
这里a将数组解组成5行共5个1维数组,而map应用的函数sum(x),他的参数是*x,也是多参数的意思。
# 等价于上面的写法:
a = [25, 29, 26, 33, 32, 18, 32]
b = [4, 4, 7, 8, 4, 6, 11]
c = [61, 41, 55, 46, 58, 29, 76]
d = [36, 35, 30, 35, 28, 27, 33]
e = [0, 3, 2, 2, 2, 0, 4]
print(list(map(lambda *x: sum(x), a, b, c, d, e)))
执行结果:
[126, 112, 120, 124, 124, 80, 156]
正因为map函数 a无论有多少个参数都是并行的机制,不是循环!这里合适的使用x,产生5个x,分别作为5个数组的每一项放到sum()里面,最终得到我们想要的结果。如果x只有1个会报错。
...同上
print(list(map(lambda x: sum(x), a, b, c, d, e)))
执行结果:
TypeError: <lambda>() takes 1 positional argument but 5 were given
map函数(函数,iterable对象),如果a是装数字的一维数组的话,那么就会报错。
a=[25, 29, 26, 33, 32, 18, 32]
print(list(map(lambda x: sum(x),a)))
执行结果:TypeError: 'int' object is not iterable
接着看,如果把 * 去掉。只去掉x的变成跟上上图一样参数不够a的个多,只去掉a的会让map去迭代二维数组里的每个一维数组。报错是:TypeError: unsupported operand type(s) for +: ‘int’ and ‘list’
把两边都去掉会变成这样:
a=[
[25, 29, 26, 33, 32, 18, 32],
[4, 4, 7, 8, 4, 6, 11],
[61, 41, 55, 46, 58, 29, 76],
[36, 35, 30, 35, 28, 27, 33],
[0, 3, 2, 2, 2, 0, 4]
]
print(list(map(lambda x: sum(x), a)))
执行结果:
[195, 44, 366, 224, 13]
这里没有使用多个x,a也只是一个二维数组的可迭代对象,计算模式变成自迭代,每个一维数组都把自己的每项放到sum()里面,得到最后的结果。
还能延伸一点:
b=[
[25, 29, 26, 32],
[4, 4, 7, 8, 4, 6, 11],
[61, 55, 58, 29, 76],
[36, 35, 30],
[0, 3, 2, 2, 0, 4, 26, 32, 18]
]
print(list(map(lambda *x: sum(x), *b)))
print(list(map(lambda x: sum(x), b)))
执行结果:
[126, 126, 123]
[112, 44, 279, 101, 87]
当二维数组的每个子数组项数不等时,会从左至右,计算完最短数组项数那么多的次数就不再算了,第四个数组只有3项,那么二维数组的前三列相加完,最后一列是26+7+58+30+2就运行完了。
与zip函数的相似点:
e=[11,22,33]
f=[44,55,66]
g=[e,f]
print(list(map(lambda *x:list(x),*g)))
print(list(zip(*g)))
执行结果:
[[11, 44], [22, 55], [33, 66]]
[(11, 44), (22, 55), (33, 66)]
有时候map函数这种情况就跟zip函数时一样的,配合*多参数来使用非常好使。
数组重构
import pprint
lwc = [[[["00:00", "00:05"], [1, 2], [3, 4]],
[["00:00", "00:05"], [5, 6], [7, 8]]],
[[["00:00", "00:05"], [9, 10], [11, 12]],
[["00:00", "00:05"], [13, 14], [15, 16]]],
[[["00:00", "00:05"], [17, 18], [19, 20]],
[["00:00", "00:05"], [21, 22], [23, 24]]]]
b = list(map(lambda x: x[0] + x[1], lwc))
pprint.pprint(b, width=100)
运行结果:
[[['00:00', '00:05'], [1, 2], [3, 4], ['00:00', '00:05'], [5, 6], [7, 8]],
[['00:00', '00:05'], [9, 10], [11, 12], ['00:00', '00:05'], [13, 14], [15, 16]],
[['00:00', '00:05'], [17, 18], [19, 20], ['00:00', '00:05'], [21, 22], [23, 24]]]