我一直在使用这种结构生成播放列表:
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)
但有时候生成的新playlist
会有新的keys
,但之前生成的dictionary
中没有。{/ p>
如何调整上面的代码,使increment function
适用于预先存在的keys
上的现有file
,并更新plist
以始终考虑新的keys
1}} value
= 1.0
?
inner
dictionary
中的一个新密钥所需的结果:
playlist = {u'user1': {u'Bittersweet Symphony':1.0, u'Roads': 2.0, u'Pyramid Song': 2.0, u'Go It Alone': 2.0}}
答案 0 :(得分:2)
d.get(i,0)
如果存在密钥,则返回密钥i
的值,否则返回0
。而不是
d[i] += value
你可以写
d[i] = d.get(i,0) + value
答案 1 :(得分:-1)
我认为你应该首先更好地标记你的变量。
除了
,你总是可以尝试一下try:
d[i] += value
except KeyError:
d[i] = 1.0
这比if语句更好,因为在大多数情况下你不会添加新密钥,而且当不需要添加密钥时,这会更快。