首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用字典值列表交叉检查列表中最常见的项

使用字典值列表交叉检查列表中最常见的项
EN

Stack Overflow用户
提问于 2020-10-05 20:19:24
回答 3查看 50关注 0票数 0

我有一个字典Songs,以歌曲为关键字,以它们的情绪为值。我还有一本Users字典,里面有收听的歌曲。现在,我想检查Songs字典中每个用户最流行的情绪,并将这些情绪放在一个新的词典中,将用户与情绪联系起来。这就是我现在所拥有的:

代码语言:javascript
复制
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字典应如下所示:

代码语言:javascript
复制
Users_moods = {
    'User1' : 'upbeat',
    'User2' : 'sad',
    'User3' : 'rock'
}
EN

回答 3

Stack Overflow用户

发布于 2020-10-05 20:25:53

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2020-10-05 20:33:23

您实际上并不是在使用Counter并试图调用列表上的most_common。让我们试着把它分解一下:

  1. 创建一个新的字典,并为每个用户找到与之相关的情绪(overall).
  2. Find该字典中每个用户最常见的情绪。

为了更好地处理% 1,我们可以使用defaultdict

代码语言:javascript
复制
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)

这提供了:

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2020-10-05 20:43:41

如果您打算使用collections.Counter,那么让我们看看您将需要的https://docs.python.org/3/library/collections.html#collections.Counter

代码语言:javascript
复制
mood_counter = Counter(iterable)

想必,iterable来自于观察一个用户,然后是他们的所有歌曲,然后是这些歌曲的所有情绪。与其尝试创建一个单行代码,不如让我们正常地迭代这些代码。

代码语言:javascript
复制
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?

这使您可以相当容易地在理解中构建字典。

代码语言:javascript
复制
Users_moods = {user: get_user_mood(user, Users, Songs) for user in Users}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64208503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档