Sum the second value of each tuple in a list
我有这样的结构:
1
| structure = [('a', 1), ('b', 3), ('c', 2)] |
我想使用sum()内置方法(在一行中)求和整数(1+3+2)。
有什么想法吗?
1
| sum(n for _, n in structure) |
会起作用。
- 令人惊讶的是,这比我的解决方案(在Python2.7、OS-X10.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)。我以前读过关于tuple解包速度有多快的文章,但看到它的实际应用很有趣。可能与x[1]评估中的绑定检查有关。
- fwiw,我把它写为sum(n for _, n in structure),以表明每对的第一件物品没有被使用。
- @马蒂诺:我喜欢。不过,它看起来确实有点模糊(就像_是一个特殊的操作符)。
- @davidrobinson——我认为,当解包时,对未使用的元素使用_是一种非常成熟的python约定。
- 这是一个相当常见的python习惯用法,尽管许多人会立即认识到这一点。
- @米吉尔森:我是为初学者准备的。如果我是一个初学者,我想知道_,是否是一个特殊的操作员。
- 我以前注意到,对于"不关心变量"的_有点争议。不过,来自prolog或haskell的初学者应该习惯它:)
- @DSM:为了避免额外数据的问题,可以先写import operator,然后写sum(operator.itemgetter(1)(t) for t in structure)。
- @戴维德罗宾森:边界怎么检查这里的问题?x, y = xy必须检查len(xy) == 2是否存在,否则会引发ValueError。
- @马蒂诺:你当然可以,但在这种情况下,这似乎是一种非常迂回的写作方式。
- @DSM:你说得对。
1
| sum(x[1] for x in structure) |
应该工作
你可以做到
- 如果你真的想避免理解的话,你可以用sum(map(operator.itemgetter(1),structure)。(但真正的意义是什么?)
- @davidrobinson——这个带有zip的新版本比我们在python2.7(OS-x 10.5)上的答案稍慢。
使用一种实用的风格,你可以
1
| reduce(lambda x,y:x+y[1], structure,0) |
- 只是一个提示,函数编程方法几乎从Python 3reduce中删除,默认情况下不再加载事件。所以在这种情况下,应该优先考虑列表理解。