Python - 增加字典值的函数

时间:2016-11-12 21:16:58

标签: python dictionary increment

从两个嵌套的dictionaries开始:

p1 = {'user1': {u'Codex': 1.0, u'High And Dry': 1.0, u'Hey': 1.0, u'O': 1.0, u'Videotape': 1.0, u'Pyramid Song': 1.0}}

p2 = {'user1': {u'Codex': 1.0, u'High And Dry': 1.0, u'Hey': 1.0, u'O': 1.0, u'Videotape': 1.0, u'Pyramid Song': 1.0, 
u'x': 1.0, u'y': 1.0, u'w': 1.0, u'z': 1.0}}

我正在获取外部keys

playlist1 = p1['user1'].keys()
playlist2 = p2['user1'].keys()

为了定义增量function,其目的是增加重复歌曲的计数,并保持所有其他歌曲不受影响,我写道:

def incremented_playlist(playlist1, playlist2):

    playlist3 = {'user1':{}}

    for song in playlist2:
        if song in playlist1:
            playlist3['user1'][song] = 2.0
        else:
            playlist3['user1'][song] = 1.0


    return playlist3  

这会为示例打印所需的output

print incremented_playlist(playlist1, playlist2)

{'user1': {u'Pyramid Song': 2.0, u'Videotape': 2.0, u'High And Dry': 2.0, u'Hey': 2.0, u'O': 2.0, u'Codex': 2.0, u'w': 1.0, u'y': 1.0, u'x': 1.0, u'z': 1.0}}

但是如何构建一个增量部分,现在只有值赋值?

是否有built-in python class哪个更好increment

1 个答案:

答案 0 :(得分:1)

如果我理解正确的话,这样的事情应该有用。您有2个播放列表,并希望在不同的播放列表中总结评分。因此,如果我在两个播放列表中都给出了一些歌曲等级1,则总和将为2,如果我只给出其中一个,则总和将为1.如果有不同于1的等级,此解决方案也将起作用。

p1 = {'user1': {u'Codex': 1.0, u'High And Dry': 1.0, u'Hey': 1.0, u'O': 1.0, u'Videotape': 1.0, u'Pyramid Song': 1.0}}
p2 = {'user1': {u'Codex': 1.0, u'High And Dry': 1.0, u'Hey': 1.0, u'O': 1.0, u'Videotape': 1.0, u'Pyramid Song': 1.0,
                u'x': 1.0, u'y': 1.0, u'w': 1.0, u'z': 1.0}}

total = dict()
for user, ratings in p1.items():
    this_user_ratings = ratings
    if user in p2:
        ratings2 = p2[user]
        for k, v in ratings2.items():
            this_user_ratings[k] = this_user_ratings.get(k, 0) + v
    total[user] = this_user_ratings
print(total)

或者,如果您需要一个适用于任意数量的词典(播放列表)的解决方案,您可能需要使用以下内容:

all_playlists = [p1, p2]

total = dict()
for playlist in all_playlists:
    for user, ratings in playlist.items():
        total.setdefault(user, dict())
        for k, v in ratings.items():
            total[user][k] = total[user].get(k, 0) + v