我有一个字典,如下所示:
cq={'A1_B2M_01':2.04, 'A2_B2M_01':2.58, 'A3_B2M_01':2.80, 'B1_B2M_02':5.00,
'B2_B2M_02':4.30, 'B2_B2M_02':2.40 etc.}
我需要计算三胞胎的平均值,其中键[2:]同意。所以,我希望得到另一本字典:
new={'_B2M_01': 2.47, '_B2M_02': 3.9}
数据是/应该是三元组,所以理论上我可以得到连续值的均值,但首先,我把它放在字典中,所以键/值可能会被重新排序,除了我&#39 ; d而是坚持使用名称,作为分配给名称的三元组的质量检查(我稍后会添加一些显示错误消息,当每组有三个以上时)。 我已经尝试创建一个字典,其中的键是_B2M_01和_B2M_02,然后遍历原始字典,首先附加分配给这些键组的所有值,以便我以后可以计算平均值,但我得到了即使在第一步也是错误,无论如何,我不确定这是否是最有效的方法......
cq={'A1_B2M_01':2.4, 'A2_B2M_01':5, 'A3_B2M_01':4, 'B1_B2M_02':3, 'B2_B2M_02':7, 'B3_B2M_02':6}
trips=set([x[2:] for x in cq.keys()])
new={}
for each in trips:
for k,v in cq.iteritems():
if k[2:]==each:
new[each].append(v)
Traceback (most recent call last):
File "<pyshell#28>", line 4, in <module>
new[each].append(v)
KeyError: '_B2M_01'
我会非常感谢任何建议。这似乎是一个相当简单的操作,但我卡住了。
另一个更好的结果是获得一个字典,其中包含cq中使用的所有名称,但值是组的平均值。所以最终的结果是:
final={'A1_B2M_01':2.47, 'A2_B2M_01':2.47, 'A3_B2M_01':2.47, 'B1_B2M_02':3.9,
'B2_B2M_02':3.9, 'B2_B2M_02':3.9}
答案 0 :(得分:2)
这样的事情应该有效。你可以把它变得更优雅。
cq = {'A1_B2M_01':2.04, 'A2_B2M_01':2.58, 'A3_B2M_01':2.80, 'B1_B2M_02':5.00, 'B2_B2M_02':4.30, 'B2_B2M_02':2.40 }
sum = {}
count = {}
mean = {}
for k in cq:
if k[2:] in sum:
sum[k[2:]] += cq[k]
count[k[2:]] += 1
else:
sum[k[2:]] = cq[k]
count[k[2:]] = 1
for k in sum:
mean[k] = sum[k] / count[k]
答案 1 :(得分:0)
cq={'A1_B2M_01':2.4, 'A2_B2M_01':5, 'A3_B2M_01':4, 'B1_B2M_02':3, 'B2_B2M_02':7, 'B3_B2M_02':6}
sums = dict()
for k, v in cq.iteritems():
_, p2 = k.split('_', 1)
if p2 not in sums:
sums[p2] = [0, 0]
sums[p2][0] += v
sums[p2][1] += 1
res = {}
for k, v in sums.iteritems():
res[k] = v[0]/float(v[1])
print res
也可以用一次迭代完成
答案 2 :(得分:0)
分组:
SEPARATOR = '_'
cq={'A1_B2M_01':2.4, 'A2_B2M_01':5, 'A3_B2M_01':4, 'B1_B2M_02':3, 'B2_B2M_02':7, 'B3_B2M_02':6}
groups = {}
for key in cq:
group_key = SEPARATOR.join(key.split(SEPARATOR)[1:])
if group_key in groups:
groups[group_key].append(cq[key])
else:
groups[group_key] = [cq[key]]
生成意味着:
def means(groups):
for group, group_vals in groups.iteritems():
yield (group, float(sum(group_vals)) / len(group_vals),)
print list(means(groups))