【问题标题】:How to use the reduce function on a list of tuples?如何在元组列表上使用 reduce 函数?
【发布时间】:2013-11-14 19:13:01
【问题描述】:

我有这个元组列表:

  a = [(1, 2), (1, 4), (1, 6)]

我想使用reduce函数来得到这个结果:

  (3, 12)

我试过了:

  x = reduce(lambda x, y: x+y, a)

但我得到一个错误...我想将每个元组的第一个索引中的所有元素相加,然后将第二个元素相加。

【问题讨论】:

    标签: python list tuples reduce


    【解决方案1】:

    如果您希望reduce 的输出为元组,则所有中间结果也应为元组。

    a = [(1, 2), (1, 4), (1, 6)]
    print reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), a)
    

    输出

    (3, 12)
    

    编辑:如果您想在列表为空时获取(0, 0)

    a = []
    print reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), [(0, 0)] + a)
    

    输出

    (0, 0)
    

    编辑 2: Reduce 接受 default initializer 作为最后一个参数,这是可选的。通过使用它,代码变成了

    a = []
    print reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), a, (0, 0))
    

    【讨论】:

    • 如果我有一个空列表并且我使用这个reduce函数它会给我结果(0,0),我该怎么做?现在,它给我一个错误,int object is not subscriptable
    • 我将 list 'a' 设为一个空列表,所以 a = [] 然后我将返回您刚刚编写的 reduce 函数。但是,在那之后我会收到一个错误。
    • @Lalala 请立即查看我的答案。
    • reduce 接受可选的initializer: reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), a, (0, 0))
    • @falsetru 编辑了我的答案以包含它。谢谢:)
    【解决方案2】:
    >>> a = [(1, 2), (1, 4), (1, 6)]
    >>> map(sum, zip(*a))
    [3, 12]
    

    更新

    根据雷蒙德·赫廷格的说法,

    zip-star 技巧滥用堆栈来昂贵地计算转置。

    这是一个不使用列表理解的替代方法。

    >>> a = [(1, 2), (1, 4), (1, 6)]
    >>> [sum(item[i] for item in a) for i in range(2)] # 2 == len(a[0])
    [3, 12]
    >>> a = []
    >>> [sum(item[i] for item in a) for i in range(2)] # 2 == len(a[0])
    [0, 0]
    

    【讨论】:

    • 或作为元组tuple(map(sum, zip(*a)))
    • 虽然很漂亮,但这确实不是解决问题的好方法。它不能很好地扩展(zip-star 技巧滥用堆栈来昂贵地计算对于解决问题并不是真正必要的转置)。
    • @RaymondHettinger,感谢您的评论。我用你的评论更新了答案。
    【解决方案3】:

    试试这个:

    >>> from numpy import asarray
    >>> a = asarray([(1, 2), (1, 4), (1, 6)])
    >>> reduce(lambda x,y:x+y, a)
    array([ 3, 12])
    

    【讨论】:

      【解决方案4】:

      你很亲密。只需修改您的代码以首先解压缩输入元组。添加新值后,只需重新打包结果元组:

      >>> a = [(1, 2), (1, 4), (1, 6)]
      >>> reduce(lambda (sx, sy), (x, y): (sx+x, sy+y), a)
      (3, 12)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-15
        • 2018-10-05
        • 1970-01-01
        • 2020-03-26
        • 2019-04-25
        • 2016-08-29
        • 2021-06-13
        相关资源
        最近更新 更多