Добавление ключа со значениями в словарь - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь сделать остаточный график для нескольких разных фильтров. У меня есть около 23 фильтров, чтобы беспокоиться о том, что всего 23 графика. Предполагается, что каждый график представляет собой остаточную стоимость в сравнении с красным смещением галактики. Для этого я хотел использовать словарь, в котором были списки для каждого фильтра и их остаточное значение для всех галактик, с которыми я работаю. Что-то вроде

resid = {}
resid[VIMOSV]['resid'] = 0.4, 0.2, 0.7, 1.1, 0.9
resid[VIMOSV]['z'] = 1.1, 1.0, 0.9, 0.8, 1.2

, так что ключом для моего словаря остатков является имя фильтра, а затем еще один ключ, чтобы вызвать остаточные значения или значения z. Вот как на самом деле выглядит мой код:

resid = {}
residval = ((residfiledat[iline]['tempa_zprior'] - residfiledat[iline]['flux_cat']) 
                    / residfiledat[iline]['flux_cat'])
if key in resid:
                        resid[key]['resid'] = np.append(resid[key]['resid'], residval)
                        resid[key]['z'] = np.append(resid[key]['z'], 
                                                    zdat[clustname[iclust]]['spec_z'][goodindx[clustname[iclust]][igood]])
                        print('key:' , key , 'exists', resid[key])


                    else: 
                        #now make the dictionary entry because it doesn't exist
                        resid[key]['resid'] = np.array([])
                        resid[key]['z'] = np.array([])  
                        resid[key]['resid'] = np.append(resid[key]['resid'], residval)
                        resid[key]['z'] = np.append(resid[key]['z'], 
                                                    zdat[clustname[iclust]]['spec_z'][goodindx[clustname[iclust]][igood]])
                        print('key created', key, resid[key])

Значения остатка взяты из предыдущего l oop, который, как я знаю, работает. Моя ошибка исходит из оператора else: 'Трассировка keyerror (последний вызов был последним) else: остаток [ключ] [' остаток '] = np.array ([]) keyerror:' FOURSTARKs '

Я посмотрел его и это в основном говорит мне, что ключ не существует, но это был весь смысл утверждения else. Если ключ существует, добавьте к нему значения, иначе: создайте ключ. Я явно не знаю, как добавить ключ в словарь, который должен содержать список, чтобы справка была бы потрясающей.

Ответы [ 2 ]

3 голосов
/ 26 марта 2020

Первая строка вашего else блока выглядит так:

resid[key]['resid'] = np.array([])

Итак, давайте разберемся. Вы получаете доступ к resid[key], а затем к:

resid[key]['resid'].

Это то же самое, что и делать:

outerKey = resid[key] # fail
outerKey['resid'] = np.array([])

Как вы можете видеть, первая строка потерпит неудачу, потому что она не существует, как вы проверили в своем операторе if. Так что вам нужно сделать:

resid[key] = {} # Creates the outer key
resid[key]['resid'] = np.array([]) # Creates the inner key

Надеюсь, это поможет

1 голос
/ 26 марта 2020

Как и @ DarK_ FirefoX в своем ответе, это из-за вложенной природы словаря.

Однако вы можете достичь желаемой функциональности следующим образом:

resid.update({key:{'resid':np.array([]),'z':np.array([])}})
...