2016-11-11 77 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',对吗? –