当相同的键配对时更新字典

时间:2019-03-22 12:01:47

标签: python dictionary

我有一个像这样的数组:

[{'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},.....

希望您能理解我的问题,因为我的英语不好。谢谢!

2 个答案:

答案 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用密钥排序。如果不是,请先使用sortedlist.sort

ds = sorted(ds, key= lambda x:x['term'])