Python Map函数—pythonic方法

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]]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值