按键分组值并在单个循环中计算它们的平均值 - Python

时间:2014-03-14 12:39:22

标签: python

我有一个对象(没有特别的顺序)

d1 = {'1':['key1',7], '2':['key2',8], '3':['key1',5], '4':['key3',2], '5':['key2',9] ...}

我想将按键和按键组合在一起。计算他们的平均值:

d2 = {'key1':[7,5], 'key2':[8,9], 'key3':[2]... }

这是代码。出于迂腐的目的,我想知道是否可以在一个循环中执行此操作? (通过使其无效或不可读而不仅仅是暴力进入单个循环)

d2=defaultdict(list)
for v in d1.values():
    d2[v[0]].append(v[1])
for k in d2.keys():
    print float(sum(d2[k]))/len(d2[k])

1 个答案:

答案 0 :(得分:2)

您可以这样使用itertools.groupbysorted功能:

d1 = {'1':['key1',7], '2':['key2',8], '3':['key1',5], '4':['key3',2], '5':['key2',9]}
d2 = sorted(d1.values(), key=lambda l:l[0])
for k,v in itertools.groupby(d2,key=lambda l:l[0]):
    v = list(v)
    print "%s: %s" % (k, sum(l[1] for l in v)/float(len(v)) )

key1: 6.0
key2: 8.5
key3: 2.0

groupby将以这种方式关联key1: [[key1,8], [key1,7]] ...以及sum函数中生成器表达式的作用是将该列表仅用于检索数字。

这段代码当然有很多隐式循环。但是关于你的问题,恕我直言,只用一个循环来完成它应该很难(如果不是不可能的话)。我只能想到一组映射到数组的有限键,以便在O(1)中访问它们,并在那个数据结构中保留 sum 到目前为止和长度到目前为止。

如果键是无限的,除了迭代之外你没有别的选择(不知怎的,也可以用哈希改进但仍然是O(n)最坏的情况)来找到它们来更新它们的值。

希望这有帮助!