簡體   English   中英

使用字典值列表計算列表交叉檢查中最常見的項目

[英]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. 創建一個新的 dict 並為每個用戶找到其相關的情緒(總體)。
  2. 從該字典中找到每個用戶最常見的心情。

為了更好地處理 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM