python字典中键的子组值的计算方法

python字典中键的子组值的计算方法,python,dictionary,Python,Dictionary,我有一本字典,看起来像这样: 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} 数据是/应该是三元组的,所以理论上我可以得到连续值的平均值,但首先,我

我有一本字典,看起来像这样:

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}
数据是/应该是三元组的,所以理论上我可以得到连续值的平均值,但首先,我在字典中有它,所以键/值可能会被重新排序,此外,我宁愿坚持使用名称,作为对分配给名称的三元组的质量检查(稍后我将添加一个显示错误消息的位,当每个组有三个以上的错误消息时)。 我曾尝试创建一个字典,其中键为_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 = {'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]
也可以通过一次迭代进行分组:

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))

不幸的是,这不起作用。我无法拆分“”,因为组的特征是B2M\u 0x,因此如果拆分它,我将得到更多且不正确的组。不确定原因,但我在尝试运行解决方案时也遇到了一个类型错误(如果group\u key in groups:TypeError:Unhable Type:'list')@branwen85我编辑了解决方案。我不理解你的评论,组是由第一个下划线的字符串决定的吗?抱歉,这不太容易解释!不,组是由后两部分决定的。因此,组是B2M_01和B2M_02。这很有效,并且与我试图编写的内容一致,谢谢!如果值是整数然后平均值会给你一个整数。请转换为float
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))