
330
|
第
12
章
>>> my_list = [[1, 2, 3], [40, 50, 60], [9, 8, 7]]
>>> import functools
>>> functools.reduce(lambda a, b: a+b, [sub[1] for sub in my_list])
60
这段代码有很多地道的用法:
lambda
、
reduce
和列表推导式。最终,这可能会变成人气
竞赛,因为它冒犯了讨厌
lambda
的人和看不上列表推导式的人——这两种人可都不少。
如果打算使用
lambda
,那么或许就不应该使用列表推导式——筛选除外,但这里不是
筛选。
下面是我给出的方案,这能讨得
lambda
拥护者的欢心。
>>> functools.reduce(lambda a, b: a + b[1], my_list, 0)
60
我没有参与那个话题,而且不会在真实的代码中使用上述方案,因为我非常不喜欢
lambda
表达式。这里只是为了举例说明不使用列表推导式可以怎么做。
第一个答复是
Fernando Perez
给出的,他是
IPython
的创建者,他的答案强调了
NumPy
支持
n
维数组和
n
维切片。
>>> import numpy as np
>>> my_array = np.array(my_list)
>>> np.sum(my_array[:, 1])
60
我觉得
Perez
的方案很棒,不过
Guy Middleton
推崇
Paul Rubin
和
Skip Montanaro
给出
的下述方案。
>>> ...