我有一个像这样的数组:
[{'term': 'outraged', 'score': 0.964, 'AffectDimension': 'anger'}, {'term': 'brutality', 'score': 0.959, 'AffectDimension': 'anger'}, {'term': 'hatred', 'score': 0.953, 'AffectDimension': 'anger'} .. UP TO 5200
我的一些值具有相同的键,例如:
{'term': 'hateful', 'score': 0.982, 'AffectDimension': 'anger'},{'term': 'hateful', 'score': 0.600, 'AffectDimension': 'fear'},{'term': 'hateful', 'score': 0.575, 'AffectDimension': 'sadness'}
现在我要用相同的密钥对更新密钥。
json_array = {}
for all in emotion_puan:
json_array[all['term']] = {all['AffectDimension'] : all['score']}
我确实尝试了上面的代码,但是如您所知,如果同一个键配对,那么dict键必须是唯一的,只是更新score和AffectDimension(根据最后一个键)。回报
.... ,'hateful': {'sadness': 0.575},.....
现在,如果相同的键值配对,我想更新我的键。
例外的输出:
.... ,'hateful': {'sadness': 0.575 , 'anger' : 0.982 , 'fear' : 0.600},.....
希望您能理解我的问题,因为我的英语不好。谢谢!
答案 0 :(得分:2)
尝试以下代码:
json_array = {}
for all in emotion_puan:
# create a dictionary for term if not exists
json_array.setdefault(all['term'], {})
# assign score for related term
json_array[all['term']][all['AffectDimension']] = all['score']
PS:您可以使用json_array = collections.defaultdict(dict)
忽略setdefault
通话
答案 1 :(得分:2)
使用itertools.groupby
:
import itertools
ds = [{'term': 'outraged', 'score': 0.964, 'AffectDimension': 'anger'},
{'term': 'brutality', 'score': 0.959, 'AffectDimension': 'anger'},
{'term': 'hatred', 'score': 0.953, 'AffectDimension': 'anger'},
{'term': 'hateful', 'score': 0.982, 'AffectDimension': 'anger'},
{'term': 'hateful', 'score': 0.600, 'AffectDimension': 'fear'},
{'term': 'hateful', 'score': 0.575, 'AffectDimension': 'sadness'}]
res = {}
for k, g in itertools.groupby(ds, lambda x:x['term']):
res[k] = {d['AffectDimension']: d['score'] for d in g}
res
#{'outraged': {'anger': 0.964},
# 'brutality': {'anger': 0.959},
# 'hatred': {'anger': 0.953},
# 'hateful': {'anger': 0.982, 'fear': 0.6, 'sadness': 0.575}}
注意:itertools.groupby
假定您的ds
用密钥排序。如果不是,请先使用sorted
或list.sort
:
ds = sorted(ds, key= lambda x:x['term'])