1. 程式人生 > >python學習--max和reduce函式

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,溫故而知新。