让我们说我正在使用这本词典:
ratings={'Shane': {'127 Hours': 5.0, 'Avatar': 4.5}, 'Jaycee': {'127 Hours': 4.8, 'Avatar': 3.5, 'Mad Max: Fury Road': 4.9}}
我试图围绕所有相同的键'值并输出它们:
ratings={'127 Hours': 4.9, 'Avatar': 4.0, 'Mad Max: Fury Road': 4.9}
Mad Max保持不变,因为它不在第一个字典中的任何地方得到平均,而阿凡达和127个小时与他们自己平均,然后合并在一个键中。做这样的事情最好的方法是什么?
答案 0 :(得分:2)
对类似密钥进行汇总的一种不错方法是使用带有defaultdict
的{{1}}:
list
输出:
{'127 Hours':4.9,'Mad Max:Fury Road':4.9,'Avatar':4.0}
答案 1 :(得分:1)
ratings={'Shane': {'127 Hours': 5.0, 'Avatar': 4.5},
'Jaycee': {'127 Hours': 4.8,
'Avatar': 3.5, 'Mad Max: Fury Road': 4.9}}
result = {}
for _,value in ratings.items():
for key,val in value.items():
result.setdefault(key, []).append(val)
print {i:sum(result[i])/len(result[i]) for i in result}
输出:
{'127 Hours': 4.9, 'Mad Max: Fury Road': 4.9, 'Avatar': 4.0}
答案 2 :(得分:1)
因为"功能性"总是更好等等;)
from itertools import chain, groupby
from operator import itemgetter
{k: (lambda g: sum(map(itemgetter(1), g)) / len(g))(list(g))
for k, g in groupby(sorted(chain.from_iterable(map(dict.items,
ratings.values())),
key=itemgetter(0)),
itemgetter(0))}
输出:
{'127 Hours': 4.9, 'Mad Max: Fury Road': 4.9, 'Avatar': 4.0}
答案 3 :(得分:0)
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
def holder = groovyUtils.getXmlHolder( "Create_shipment#Response" )
// loop item nodes in response message
for( item in holder.getNodeValues( "//error.code" ))
log.info "errors : [$item]"
def no = holder["count(//error)"]
给你import itertools, operator
d = {}
for movie, items in itertools.groupby(sorted(itertools.chain(*[x.items() for x in ratings.values()])), lambda x: x[0]):
items = list(items)
d[movie] = sum(x[1] for x in items)/len(items)
我不推荐它但是到底是什么。 :)