2016-11-12 94 views
1

从两个嵌套dictionaries开始:的Python - 功能来增加字典值

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其目的是增加计数fo [R重复的歌曲,并保持所有其他人的影响,我写道:

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-inpythonclass哪个没有increment好?

+0

你想总结值匹配字典中的值? – Mark

+0

*代码的增量部分* - 此时代码中没有增量部分,只是具体分配。你能详细说明你的问题吗? – RomanPerekhrest

+0

我想为之前匹配的所有'values'加上'+ 1.0'' keys' –

回答

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 
+0

是的,我要为每首歌曲播放“count”,但是歌曲播放的时间也可以被认为是它的排名。 –