如何对包含字典元素的列表求和

时间:2013-06-01 22:18:46

标签: python list dictionary

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

让我说我有字典

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

然后我有名单

q = ['A', 'B']       

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

谢谢!

4 个答案:

答案 0 :(得分: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

如果在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.

list comprehension版本大致相当于:

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)generator expression,而不是在内存中生成整个列表,而是一次返回一个值。

summ = 0
for x in q:
    summ += p.get(x,0)
print summ

答案 1 :(得分:4)

你可以做到

sum(p[k] for k in q)

此表达式p[k] for k in q是一个generator comprehension - 类似于list comprehension,但它永远不必构建整个列表(这使得它在您需要的时候更快,更节省内存是总和)。

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

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

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

答案 2 :(得分:3)

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

>>> p = {'A' : 1, 'B' : 2, 'C' : 3}
>>> q = ['A', 'B']
>>> import operator
>>> sum(operator.itemgetter(*q)(p))
3

答案 3 :(得分:2)

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

sum(p[x] for x in p.viewkeys() & q)