1

我不确定我是否正确地问了这个问题,但我的意思是:

可以说我有字典

p = {'A' : 1, 'B' : 2, 'C' : 3}

然后我有清单

q = ['A', 'B']       

我如何对 q 求和以使结果为 3?

谢谢!

4

4 回答 4

6

使用内置函数sum和生成器表达式:

>>> p = {'A' : 1, 'B' : 2, 'C' : 3}
>>> q = ['A','B']
#using generator expression
>>> sum(p.get(x,0) for x in q)
3
#using list comprehension, not memory efficient
>>> sum( [p.get(x,0) for x in q] )
3

如果 in 中的任何元素q未找到,p则将dict.get返回默认值0,因此不会引发错误。

帮助dict.get

>>> print dict.get.__doc__
D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.

列表理解版本大致相当于:

sums = []
for x in q:                  #loop over each item in q            
    sums.append(p.get(x,0))  #fetch the value of item from p and append it to sums  
print sum(sums)              # sum the list sums

(p.get(x,0) for x in q)是一个生成器表达式,它不是在内存中生成整个列表,而是一次返回一个值。

summ = 0
for x in q:
    summ += p.get(x,0)
print summ
于 2013-06-01T22:19:51.800 回答
4

你可以做

sum(p[k] for k in q)

这个表达式p[k] for k in q是一个生成器推导- 类似于列表推导,除了它永远不必构造整个列表(当您只需要求和时,这使得它更快,更节省内存)。

请注意,此代码基本上是更简洁的版本:

total = 0
for k in q:
    total = total + p[k]

这对你来说可能更清楚一点。

于 2013-06-01T22:20:57.033 回答
3

函数式编程和operator.itemgetter函数的一种方法:

>>> p = {'A' : 1, 'B' : 2, 'C' : 3}
>>> q = ['A', 'B']
>>> import operator
>>> sum(operator.itemgetter(*q)(p))
3
于 2013-06-01T22:23:55.310 回答
2

viewkeys另一种方法:利用dictionary返回一个类似set对象的事实。对于大型列表,这提供了性能优势。

sum(p[x] for x in p.viewkeys() & q)
于 2013-06-01T22:52:36.237 回答