我有一个字典Songs,以歌曲为关键字,以它们的情绪为值。我还有一本Users字典,里面有收听的歌曲。现在,我想检查Songs字典中每个用户最流行的情绪,并将这些情绪放在一个新的词典中,将用户与情绪联系起来。这就是我现在所拥有的:
from collections import Counter
Songs = {
'Song1' : ['techno', 'upbeat'],
'Song2' : ['rock', 'upbeat'],
'Song3' : ['pop', 'sad'],
'Song5' : ['pop', 'calm'],
'Song6' : ['rap', 'upbeat'],
'Song7' : ['rock', 'sad']
}
Users = {
'User1' : ['Song1', 'Song2', 'Song6'],
'User2' : ['Song3', 'Song7'],
'User3' : ['Song2', 'Song7']
}
Users_moods = dict.fromkeys(Users)
for user, song in Users.items():
for song, mood in Songs.items():
mood = set(mood)
mood_counter = Songs[song]
Users_moods = {user: counter.most_common(1)[0][0] for user, counter in Users.items()}
print(Users_moods)
print(Songs)
print(Users)但它给了我错误。对于此示例,Users_mood字典应如下所示:
Users_moods = {
'User1' : 'upbeat',
'User2' : 'sad',
'User3' : 'rock'
}发布于 2020-10-05 20:25:53
def getMoods(user, users, songs):
userSongs = users[user] # songs this user listens to
moods = {} # count of each mood this user listens to
for song in userSongs:
for mood in songs[song]: # for each mood of that song
moods.setdefault(mood, 0)
moods[mood] += 1
return max(moods, key=moods.get) # the most prevalent mood
for user in users:
print(user, 'likes', getMoods(user, users, songs)) # mood with the highest count发布于 2020-10-05 20:33:23
您实际上并不是在使用Counter并试图调用列表上的most_common。让我们试着把它分解一下:
为了更好地处理% 1,我们可以使用defaultdict
from collections import Counter, defaultdict
Users_moods = defaultdict(list)
for user, songs in Users.items():
for song in songs:
Users_moods[user].extend(Songs[song])
common_moods = {user: Counter(moods).most_common(1)[0][0] for user, moods in Users_moods.items()}
print(Users_moods)
print(common_moods)这提供了:
defaultdict(<class 'list'>, {'User1': ['techno', 'upbeat', 'rock', 'upbeat', 'rap', 'upbeat'], 'User2': ['pop', 'sad', 'rock', 'sad'], 'User3': ['rock', 'upbeat', 'rock', 'sad']})
{'User1': 'upbeat', 'User2': 'sad', 'User3': 'rock'}或者,您可以使用相同的循环动态构建common字典,方法是为每个用户创建单独的Counter:
common_moods = {}
for user, songs in Users.items():
User_moods = Counter()
for song in songs:
User_moods += Counter(Songs[song])
common_moods[user] = User_moods.most_common(1)[0][0]
print(common_moods)发布于 2020-10-05 20:43:41
如果您打算使用collections.Counter,那么让我们看看您将需要的https://docs.python.org/3/library/collections.html#collections.Counter
mood_counter = Counter(iterable)想必,iterable来自于观察一个用户,然后是他们的所有歌曲,然后是这些歌曲的所有情绪。与其尝试创建一个单行代码,不如让我们正常地迭代这些代码。
def get_user_mood(user, Users, Songs):
accumulated_moods = []
for song_name in Users[user]:
moods_for_this_song = Songs[song_name]
accumulated_moods.extend(moods_for_this_song)
mood_counter = Counter(accumulated_moods)
return mood_counter.most_common(1)[0][0] # validate?这使您可以相当容易地在理解中构建字典。
Users_moods = {user: get_user_mood(user, Users, Songs) for user in Users}https://stackoverflow.com/questions/64208503
复制相似问题