2016-11-11 93 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) 

我使用@Moses Koledoye提出這方面的工作功能updateTrackCounts(),由一個遞增的軌道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) 

但有時產生將有新的keysplaylist,即不存在之前產生的dictionary

如何調整上面的代碼,因此使得increment function應用到預先存在的預先存在filekeys,並更新plist總是新keysvalue = 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) 

如果存在這樣的鍵,否則0返回鍵i值。因此,而不是

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] = value'改爲'd [i] = 1.0'。因此,應該將新密鑰初始化爲1.0 –

+0

__never__使用純粹的except子句,始終使用預期的異常類型。如果'value'碰巧是一個字符串,'None'或者任何你不能添加到float或int的類型,你都不希望現有的鍵被重置爲'1.0',對嗎? –