更新新词典键+增加旧词典值

时间:2016-11-11 01:50:12

标签: python dictionary

我一直在使用这种结构生成播放列表:

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}}

2 个答案:

答案 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语句更好,因为在大多数情况下你不会添加新密钥,而且当不需要添加密钥时,这会更快。