#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'])