我有一个对象(没有特别的顺序)
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])
答案 0 :(得分:2)
您可以这样使用itertools.groupby
和sorted
功能:
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)最坏的情况)来找到它们来更新它们的值。
希望这有帮助!