2016-11-12 55 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」,但是歌曲播放的時間也可以被認爲是它的排名。 –