2016-11-12 3 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 г повторил песни, и держать все остальные без изменений, я писал:

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

но как построить increment part, где теперь существует только присвоение значения?

Есть built-inpythonclass который делает increment лучше?

+0

вы хотите суммировать значения для сопоставления словарных значений? – Mark

+0

* инкрементная часть кода * - в вашем коде нет добавочной части, а только конкретное задание. Вы можете уточнить свой вопрос? – RomanPerekhrest

+0

Я хотел бы добавить '+ 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

да, я собирался сказать 'counts' для каждой песни, но времена, в которые играется песня, можно считать ее ранжированием. –