2016-11-11 3 views
1

Я постоянно генерируя плейлист с этой структурой:Обновление нового словаря ключи + прибавка старого словаря значения

playlist = {u'user1': {u'Roads': 1.0, u'Pyramid Song': 1.0, u'Go It Alone': 1.0}} 

и я загрузить его в каталог. Затем я проверяю, был ли файл ранее загружен.

if os.path.exists('db/playlist.json'): 
      with open('playlist.json', 'r+') as f: 
       plist = json.load(f) 
       # increment track count 
       updateTrackCounts(db_1,value=1) 
       #update json here 
       f.seek(0) 
       f.truncate() 
       json.dump(plist, f) 
       print (plist) 

Я использую эту рабочую функцию updateTrackCounts() предложенную @Moses Koledoye, что увеличивает трек counts на единицу.

def updateTrackCounts(d, value=0): 
    for i in d: 
     if isinstance(d[i], dict): 
      updateTrackCounts(d[i], value) 
     elif isinstance(d[i], float): 
      d[i] += value 

updateTrackCounts(playlist, value=1) 

но иногда новый playlist генерироваться будет иметь новый keys, которые не присутствовали в dictionary сгенерированного ранее.

Как настроить код выше, так что делает increment function применять предварительно существующие keys на предварительно существующие file и обновлять plist всегда лицезреть новый keys с value = 1.0?

Желаемый результат с одним новым ключом в innerdictionary:

playlist = {u'user1': {u'Bittersweet Symphony':1.0, u'Roads': 2.0, u'Pyramid Song': 2.0, u'Go It Alone': 2.0}} 
+0

@Moses Koledoye –

ответ

2
d.get(i,0) 

возвращает значение ключа i, если такой ключ существует, иначе 0. Таким образом, вместо

d[i] += value 

вы могли бы написать

d[i] = d.get(i,0) + value 
-1

Я думаю, вы должны начать лучше мечения переменные.

Вы можете просто использовать все дни попробовать кроме

try: 
    d[i] += value 
except KeyError: 
    d[i] = 1.0 

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

+0

вы заметили новый '' key' с значением: 1.0' (новый пункт) в желаемый результат? –

+0

Хорошо, я изменил 'd [i] = значение' to 'd [i] = 1.0' в ответе. Таким образом, это должно инициализировать новый ключ до 1.0 –

+0

__never__, используя предложение bare except, всегда используйте ожидаемый тип исключения. Вы бы не захотели, чтобы существующий ключ был сброшен до '1.0', если' value' оказалось строкой, 'None' или просто любым типом, который вы не можете добавить в float или int, не так ли? –

Смежные вопросы