Xupeng's blog

圆外之大,心向往之

python函数之max和reduce

问题: 我有这样的一个列表:

1
['a.b.c.d11u.e.f.g', 'e.f88.g', 'caa3.z.brr', 'z.48.ff.ee']

需要找节点最多的一个(节点间由.分割)

看似简单的工作,要用 Pythonic 的方法来做,还是要对 Python 的内置函数有一定程度的熟悉,比如这里可以用最熟悉不过的max,但是会用到它并不常用的可选参数:key

1
2
node_list = ['a.b.c.d11u.e.f.g', 'e.f88.g', 'caa3.z.brr', 'z.48.ff.ee']
max_node = max(node_list, key=lambda n: n.count('.'))

在这里,使用key参数改变了max比较列表元素的方法,达到了完成任务的目的。

顺便再温习一下另一个用的不是很多的内置函数:reduce,使用它来解决这个问题

1
2
node_list = ['a.b.c.d11u.e.f.g', 'e.f88.g', 'caa3.z.brr', 'z.48.ff.ee']
max_node = reduce(lambda a,b: a.count('.') >= b.count('.') and a or b, node_list)

reduce接受两个必选参数,第一个参数是一个函数,这个函数接受两个参数,返回一个值;第二个参数是一个序列(比如列表); reduce 首先把序列的前两个元素作为参数传递给参数函数,然后把参数函数的返回值和序列的第三个参数一起再传递给参数函数,依次类推,最终只剩下一个值。这么解释似乎更晕啦,哈哈,还是 Python 自己的 help 说的好:

1
For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5)

当然了,就这个问题而言,首选 max。Okay,重新学习了 max,温习了 reduce,温故而知新。

Comments