具有多个参数的 Python 映射函数到元组列表

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 的每个元组,并希望获得这些单个数字的总和。我如何在一个语句中做到这一点?我如何在这里映射函数和使用列表理解?

jua*_*aga 8

在这种特殊情况下,我认为您只想:

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)

对我来说同样优雅。


Ste*_*ann 6

首先,让我们使用所有值使其成为一个实际的工作函数,例如:

>>> 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)

哈哈。没有看到这一点。