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

时间:2017-10-31 22:53:03

标签: python list list-comprehension 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])

function f 的三个参数是每个元组的三个元素。 现在,我想将函数 f 应用于列表 l 的每个元组,并希望获得这些单个数字的总和。我怎么在一个声明中这样做?如何在此处映射函数和使用列表推导?

4 个答案:

答案 0 :(得分:3)

在这个特定的案例中,我认为你只想:

sum(n for n,_,_ in l)

但总的来说,您正在寻找itertools.starmap,所以

list(itertools.starmap(f, iterable)) 

相当于

[f(*xs) for xs in iterable]
因此,"明星"地图。通常情况下,我会这样做:

sum(f(*xs) for xs in iterable)

对于一般情况,尽管:

sum(itertools.starmap(f, iterable))

对我来说同样优雅。

答案 1 :(得分:2)

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

>>> def f(x, y, z):
        return x + len(y) + len(z)

现在您的示例数据:

>>> l = [(10, 'abc', 'def'), (20, 'efg', 'hij')]

一种方法,给地图三个迭代(每个“列”一个):

>>> sum(map(f, *zip(*l)))
42

洛尔。没有看到即将到来。

答案 2 :(得分:1)

你可以试试这个:

def f(*args):
    return sum(map(lambda x:x[0], args))

l = [(10, 'abc', 'def'), (20, 'efg', 'hij'), (30, "klm", "nop")]
print(f(*l))

输出:

60

答案 3 :(得分:1)

如果你需要的只是总和,你可以用这个单行代码获得它:

s = sum(t[0] for t in l)

<强>输出:

>>> l = [(10, 'abc', 'def'), (20, 'efg', 'hij')]
>>> s = sum(t[0] for t in l)
>>> s
30