![](/img/trans.png)
[英]How do I calculate an average from averages in a dictionary with multiple values in each key without using sum()?
[英]In python, how do I find the sum of values in a dictionary? Where each key has multiple values
我的数据以制表符分隔,看起来像这样:
Name Count Sample
Dog .0001 1
Dog .00003 1
Dog .0001 2
Cat .0004 1
Cat .0002 1
Cat .0003 2
Cat .0002 2
在我将变量unid定义为第一列并与第三列(例如Dog_1)合并,并将num作为该行的Count定义之后,我将每个num附加到unid下的字典中(使用Python 2.7),如下所示:
for line in K:
sp = line.split("\t")
name = sp[0]
unid = sp[3][:-2] +"_"+ sp[0]
num = int(Decimal(sp[1]))
if not dict1.has_key(unid):
dict1[unid] = []
dict1[unid].append(num)
我试着总结一下:
dictTot = sum(dict1.values())
但我收到此错误消息:
TypeError: unsupported operand type(s) for +: 'int' and 'list'
如何求和这些值,以便可以检索Cat_1: .0006, Cat_2: .0005
等?
对不起大家,据我所知? 不好。 但是,正如下面的雅各布所说,“ dictTot = sum(sum(value)for dict1.values())中的值”将所有和相加,但是我要寻找的是将每个键下的每组值分别求和我可以找出样本1中有多少只猫,依此类推。 也许总和不合适吗? 抱歉,显然我不是Python杰出人士。
sum
不是这样的。 您正在尝试通过“添加”一堆列表来获取整数(或数值类型),因此内置函数非常奇怪。 尝试以下方法:
dictTot = sum(sum(value) for value in dict1.values())
这将求和所有的总和,这就是您想要的(我认为)。
编辑
显然,您希望对列表的每个元素中的所有值求和。 为此,您可以使用字典理解 :
dictTot = {key:sum(l_values) for key, l_values in dict1.items()}
我基本上重写了整个内容...
K = "Dog .0001 1\n Dog .00003 1\n Dog .0001 2\n Cat .0004 1\n Cat .0002 1\n Cat .0003 2\n Cat .0002 2"
dict1 = {}
for line in K.split("\n"):
sp = line.split()
name = sp[0]
unid = "_".join([sp[0] , sp[2][-2:]])
num = float(sp[1])
if not dict1.has_key(unid):
dict1[unid] = [num,]
else :
dict1[unid].append(num)
print(dict1)
dictTot = sum([sum(x) for x in dict1.values()])
print(dictTot)
最后的决定是
{'Dog_2': [0.0001],
'Dog_1': [0.0001, 3e-05],
'Cat_1': [0.0004, 0.0002],
'Cat_2': [0.0003, 0.0002]}
总和是
0.00133
这些值是列表,因此您要循环循环以分别求和。
编辑
显然现在您需要“ Cat_1:.0006,Cat_2:.0005等”,因此根据dict1
,您可以
for key in dict1.iterkeys():
dict1[key] = sum(dict1[key])
现在dict1
变成
{'Dog_2': 0.0001,
'Dog_1': 0.00013,
'Cat_1': 0.0006,
'Cat_2': 0.0005}
为了对所有值求和,必须首先将所有列表连接在一起,成为sum()
可以处理的一个可迭代对象。 有两种方法可以做到这一点:
dictTot = sum(sum(dict1.values(), []))
稍微冗长一些,但更易读:
from itertools import chain
dictTot = sum(chain.from_iterable(dict1.values()))
sum()
实际上有两个参数。 第二个参数start
默认为0
。 因此,您将获得有关将int
添加到list
的错误消息。 本质上,它是在这样做: 0 + [1, 2, 3] + [1, 2]...
在第一个示例中,我将默认起始值设置为一个空列表。 结果是一个列表。 现在,我将所有值都放在一个列表中,我可以对结果sum()
以获得答案。
编辑
回应您的更新:
您可以使用生成器表达式执行此操作:
dictTot = {key: sum(value) for key, value in dictTot.items()}
或者,如果您使用的是<Python 2.7:
dictTot = dict((key, sum(value)) for key, value in dictTot.iteritems())
回答:
dict((k,sum(v)) for k,v in dict1.iteritems())
是的,更改int(Decimal('.0001'))
并使用defaultdict
+1带有否决权的问题,然后有四个答案错过了oneliner答案
编辑哎呀,我想念@Joel Cornett也有这么道具
这有效:
d={}
for line in K:
sp = line.strip().split()
unid = sp[0]+"_"+sp[-1]
num = decimal.Decimal(sp[1])
d.setdefault(unid,[]).append(num)
print({k:sum(v) for k, v in d.items()})
打印:
{'Dog_1': Decimal('0.00013'),
'Cat_2': Decimal('0.0005'),
'Cat_1': Decimal('0.0006'),
'Dog_2': Decimal('0.0001')}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.