[英]Count most common item in list crosschecking with dictionary value lists
我有一本以歌曲為鍵,以他們的心情為值的字典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'
}
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
您實際上並沒有使用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'}
或者,您可以通過為每個用戶創建一個單獨的Counter
來使用相同的循環即時構建common
字典:
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)
如果你打算使用 collections.Counter,讓我們看看https://docs.python.org/3/library/collections.html#collections.Counter你將需要
mood_counter = Counter(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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.