在Python字典中对值求和,但排除一个特定的值

3
有没有一种方法可以在Python字典中使用选择器对除一个值以外的所有值求和?
>>> x = dict(a=1, b=2, c=3)
>>> np.sum(x.values())
6

我的当前解决方案是基于循环的:
>>> x = dict(a=1, b=2, c=3)
>>> y = 0
>>> for i in x:
...     if 'a' != i:
...             y += x[i]
... 
>>> y
5

EDIT:
import numpy as np
from scipy.sparse import *
x = dict(a=csr_matrix(np.array([1,0,0,0,0,0,0,0,0]).reshape(3,3)),      b=csr_matrix(np.array([0,0,0,0,0,0,0,0,1]).reshape(3,3)), c=csr_matrix(np.array([0,0,0,0,0,0,0,0,1]).reshape(3,3)))
y = csr_matrix((3,3))
for i in x: 
    if 'a' != i:
        y = y + x[i]
print y

返回结果为 (2, 2) 2.0

并且

print np.sum(value for key, value in x.iteritems() if key != 'a')

raises

File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-    packages/numpy/core/fromnumeric.py", line 1446, in sum
    res = _sum_(a)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/sparse/compressed.py", line 187, in __radd__
    return self.__add__(other)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/sparse/compressed.py", line 173, in __add__
    raise NotImplementedError('adding a scalar to a CSC or CSR '
NotImplementedError: adding a scalar to a CSC or CSR matrix is not supported
3个回答

8
你可以循环遍历字典,为sum方法创建一个生成器:
np.sum(value for key, value in x.iteritems() if key != 'a')

谢谢,对于我的示例来说,这很好用!不幸的是,我的真实字典包含csc_matrices。通过应用您的代码,会引发“NotImplementedError:不支持将标量添加到CSC或CSR矩阵”的错误。我猜测,无法对这些矩阵进行np.sum。我应该发布一个新的不起作用的示例吗? - Milla Well
@MillaWell:好的,请这么做。 - Martijn Pieters
可以通过对列表推导式进行np.sum求和来解决此问题。 - DSM
@DSM:你的意思是什么?我应该使用列表而不是字典吗?这意味着我需要转换/强制转换所有字典。 - Milla Well
@MillaWell:不,我的意思是你可以简单地添加括号并使用np.sum([value for key, value in x.iteritems() if key != 'a'])。括号语法是列表推导而不是生成器表达式。 - DSM

4

尝试:

np.sum(x.values()) - x['a']

2
您需要为sum方法提供一个累加器或初始值:
sum((value for key, value in x.iteritems() if key != 'a'), csr_matrix((3, 3)))

请注意,这里使用的是内置的sum方法。 它与基于循环的解决方案几乎完全相同。
使用np.sum不起作用,因为np.sum不传递out参数,并且是为密集矩阵设计的。
np.sum((value for key, value in x.iteritems() if key != 'a'),
       out=csr_matrix((3, 3)))    # doesn't work

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接