首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一个新字典来总结使用循环的原始字典。

创建一个新字典来总结使用循环的原始字典。
EN

Stack Overflow用户
提问于 2022-10-27 03:03:22
回答 3查看 39关注 0票数 0

数据集或指定的字典是:

代码语言:javascript
复制
# A list of video reviews
# - Each review has the name of the video, the numer of views
#   and a list of user reviews.
# - Each user review has the user's name and the review they gave
#   to the video.

video_reviews = [
    {
        "name": "Cats doing nothing",
        "number_of_views": 450743,
        "reviews": [
            {"name": "Jeb", "review": 5},
            {"name": "Samantha", "review": 2},
            {"name": "Crystal", "review": 3},
        ]
    },
    {
        "name": "All Fail",
        "number_of_views": 1239734,
        "reviews": [
            {"name": "Crystal", "review": 5},
            {"name": "Frank", "review": 3},
            {"name": "Jeb", "review": 3},
        ]
    },
    {
        "name": "Runaway Nintendo",
        "number_of_views": 48343,
        "reviews": [
            {"name": "Samantha", "review": 4},
            {"name": "Bill", "review": 3},
            {"name": "Sarah", "review": 4},
        ]
    },
]

这是我的问题:我想定义一个函数并创建一个用户摘要--一个字典--其中键是用户的名字,值是他们已经查看过的视频列表。预期结果如下:

代码语言:javascript
复制
{
    "Jeb": ["Cats doing nothing", "All Fail"],
    "Samantha": ["Cats doing nothing","Runaway Nintendo"],
    "Crystal": ["Cats doing nothing", "All Fail"],
    "Frank": ["All Fail"],
    "Bill": ["Runaway Nintendo"],
    "Sarah": ["Runaway Nintendo"],
}

目前,我的代码是:

代码语言:javascript
复制
def create_user_summary(video_reviews):
    summary = {}
    for video in video_reviews:
        for person in video["reviews"]:
            user = person["name"]
            video_name = []
            if person["name"] == user:
                video_name.append(video["name"])
                summary[user] = video_name
    return summary
代码语言:javascript
复制
AssertionError: 
You returned:
    {'Jeb': ['All Fail'], 'Samantha': ['Runaway Nintendo'], 'Crystal': ['All Fail'], 'Frank': ['All Fail'], 'Bill': ['Runaway Nintendo'], 'Sarah': ['Runaway Nintendo']}
instead of:
    {'Jeb': ['Cats doing nothing', 'All Fail'], 'Samantha': ['Cats doing nothing', 'Runaway Nintendo'], 'Crystal': ['Cats doing nothing', 'All Fail'], 'Frank': ['All Fail'], 'Bill': ['Runaway Nintendo'], 'Sarah': ['Runaway Nintendo']}

如何修改代码并使输出与预期的输出匹配?

EN

回答 3

Stack Overflow用户

发布于 2022-10-27 03:16:14

下面是您的代码的修改版本,我认为它提供了您想要的内容:

代码语言:javascript
复制
def create_user_summary(video_reviews):
    summary = {}
    for video in video_reviews:
        for person in video["reviews"]:
            summary.setdefault(person["name"], []).append(video["name"])
    return summary

结果“

代码语言:javascript
复制
{'Jeb': ['Cats doing nothing', 'All Fail'], 'Samantha': ['Cats doing nothing', 'Runaway Nintendo'], 'Crystal': ['Cats doing nothing', 'All Fail'], 'Frank': ['All Fail'], 'Bill': ['Runaway Nintendo'], 'Sarah': ['Runaway Nintendo']}
票数 1
EN

Stack Overflow用户

发布于 2022-10-27 03:33:31

您可以为此使用一些内置的python函数,比如sortedgroupby,并将其与list和dict理解结合在一起:

代码语言:javascript
复制
from itertools import groupby
source = ((rev['name'], vid['name']) for vid in video_reviews for rev in vid['reviews'])
result = {k: list(m for _, m in g) for k, g in groupby(sorted(source), lambda x: x[0])}
print(result)
票数 0
EN

Stack Overflow用户

发布于 2022-10-27 03:50:52

你可以用defaultdict

代码语言:javascript
复制
from collections import defaultdict

result = defaultdict(list)
for item in video_reviews:
    for review in item['reviews']:
        result[review['name']].append(item['name'])
print(dict(result))

结果:

代码语言:javascript
复制
{'Jeb': ['Cats doing nothing', 'All Fail'],
 'Samantha': ['Cats doing nothing', 'Runaway Nintendo'],
 'Crystal': ['Cats doing nothing', 'All Fail'],
 'Frank': ['All Fail'],
 'Bill': ['Runaway Nintendo'],
 'Sarah': ['Runaway Nintendo']}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74216315

复制
相关文章

相似问题

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