【问题标题】:Sum the second value of each tuple in a list对列表中每个元组的第二个值求和
【发布时间】:2017-10-20 06:19:29
【问题描述】:

我有这样的结构:

structure = [('a', 1), ('b', 3), ('c', 2)]

我想使用sum() 内置方法(在一行中)对整数(1+3+2)求和。

有什么想法吗?

【问题讨论】:

    标签: python


    【解决方案1】:
    sum(n for _, n in structure)
    

    会起作用的。

    【讨论】:

    • 令人惊讶的是,这比我的解决方案快一点(在 python 2.7、OS-X 10.5 上)。 -- 使用列表推导将这里的速度提高了近 50%(对于这个小例子)。
    • 我能想到的唯一弱点是,如果一个元素恰好是('a', 3, 'extra-data-to-ignore'),它将不起作用,而显式索引和zip 都接近——甚至是reduce ——这样概括好一点。我猜在 Py3 中你可以写 sum(b for _, b, *_ in structure) 什么的……
    • @mgilson:从我嘴里说出来,我自己运行测试(Python 2.7,OS-X 10.7)。我以前读过关于元组解包的速度有多快,但看到它在行动中很有趣。可能与x[1] 评估中的边界检查有关。
    • 这是一个相当常见的 Python 习语,但许多人会立即认出。
    • @martineau:你当然可以,但在这种情况下,t[1]..
    【解决方案2】:
    sum(x[1] for x in structure)
    

    应该工作

    【讨论】:

      【解决方案3】:

      你可以的

      sum(zip(*structure)[1])
      

      【讨论】:

      • 如果你真的想避免理解,你可以使用sum(map(operator.itemgetter(1),structure)...(但真正的意义是什么?)
      • @DavidRobinson -- 这个带有zip 的新版本比我们在 python2.7 (OS-X 10.5) 上的答案略慢。
      【解决方案4】:

      使用函数式样式,您可以这样做

      reduce(lambda x,y:x+y[1], structure,0)
      

      【讨论】:

      • 只是一个提示,函数式编程方法几乎从@987654322 中删除@reduce 不再默认加载事件。所以在这种情况下应该首选列表推导
      猜你喜欢
      • 2013-03-21
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多