Обновлять словарь, когда одинаковые ключи являются парой

#python #dictionary

#python #словарь

Вопрос:

У меня есть массив, подобный :

 [{'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 должны быть уникальными, если один и тот же ключ соединит его, просто обновит оценку и повлияет на размер (согласно последнему.) . Этот возврат

 .... ,'hateful': {'sadness': 0.575},.....
  

Теперь я хочу обновить свои ключи, если одинаковые значения ключей совпадают.

Исключенный вывод :

  .... ,'hateful': {'sadness': 0.575 , 'anger' : 0.982 , 'fear' : 0.600},.....
  

Я надеюсь, вы понимаете мой вопрос, потому что мой английский не очень хорош.Спасибо!!!

Ответ №1:

попробуйте этот код:

 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 вызов

Ответ №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'])