标题可能听起来很奇怪,但这就是我的意思:
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 的每个元组,并希望获得这些单个数字的总和。我怎么在一个声明中这样做?如何在此处映射函数和使用列表推导?
答案 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