【问题标题】:Python map function with multiple arguments to a list of tuples [duplicate]具有多个参数的Python映射函数到元组列表[重复]
【发布时间】:2017-10-31 22:53:03
【问题描述】:

标题可能听起来很奇怪,但我的意思是:

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

【问题讨论】:

  • 但是一般来说,你是在找itertools.starmap,所以list(itertools.starmap(f, iterable))相当于[f(*xs) for xs in iterable]
  • 您只需要这些数字的总和吗?意味着在这里使用地图是一个要求吗?
  • 我的意思是这三个参数会有一些处理。然后将返回一个值。

标签: python list list-comprehension map-function


【解决方案1】:

在这个特殊的案例中,我想你只是想要:

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

对我来说同样优雅。

【讨论】:

    【解决方案2】:

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

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

    现在你的示例数据:

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

    还有一种方法,给 map 三个可迭代对象(每个“列”一个):

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

    哈哈。没想到会这样。

    【讨论】:

    • 你和@juanpa.arrivillaga 的回答既优雅又精彩!但是,我接受他的回答,因为它是早些时候发布的。
    【解决方案3】:

    你可以试试这个:

    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
    

    【讨论】:

    • 我也想在计算中包含其他参数...
    【解决方案4】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 2020-10-17
      • 1970-01-01
      • 2015-11-13
      相关资源
      最近更新 更多