Has*_*bal 3 python list-comprehension list map-function
标题可能听起来很奇怪,但这就是我的意思:
def f(x, y, z):
return a_single_number_from_xyz
l = [(10, 'abc', 'def'), (20, 'efg', 'hij')]
print sum([ret_value_of_f_from_first_tuple, ret_value_of_f_from_second_tuple])
Run Code Online (Sandbox Code Playgroud)
函数 f的三个参数是每个元组的三个元素。现在,我想将函数f应用于列表l 的每个元组,并希望获得这些单个数字的总和。我如何在一个语句中做到这一点?我如何在这里映射函数和使用列表理解?
在这种特殊情况下,我认为您只想:
sum(n for n,_,_ in l)
Run Code Online (Sandbox Code Playgroud)
但总的来说,你正在寻找itertools.starmap,所以
list(itertools.starmap(f, iterable))
Run Code Online (Sandbox Code Playgroud)
相当于
[f(*xs) for xs in iterable]
Run Code Online (Sandbox Code Playgroud)
因此,“星”地图。通常,我只会这样做:
sum(f(*xs) for xs in iterable)
Run Code Online (Sandbox Code Playgroud)
对于一般情况,虽然:
sum(itertools.starmap(f, iterable))
Run Code Online (Sandbox Code Playgroud)
对我来说同样优雅。
首先,让我们使用所有值使其成为一个实际的工作函数,例如:
>>> def f(x, y, z):
return x + len(y) + len(z)
Run Code Online (Sandbox Code Playgroud)
现在您的示例数据:
>>> l = [(10, 'abc', 'def'), (20, 'efg', 'hij')]
Run Code Online (Sandbox Code Playgroud)
一种方法是给 map 三个可迭代对象(每个“列”一个):
>>> sum(map(f, *zip(*l)))
42
Run Code Online (Sandbox Code Playgroud)
哈哈。没有看到这一点。