【问题标题】:How to create a dictionary of dictionaries using dict comprehension?如何使用字典理解创建字典字典?
【发布时间】:2018-06-21 18:11:42
【问题描述】:

我正在尝试使用对列表列表的字典理解来创建字典字典。

列表列表包含学生姓名、作业名称和成绩。例如,数据可能如下所示:

grades_lists = [
    ['Student', 'Test', 'Assignment', 'Exam'],
    ['Bella', '80', '90', '100'],
    ['Sam', '65', '75', '85'],
    ['Emily', '60', '75', '90'],
]

我想创建一个字典,将学生姓名映射到包含作业名称和成绩的字典。例如:

grades_dicts['Bella']['Test'] == 80

我想要的字典是这样的:

{
    'Bella': {'Test': 80, 'Assignment': 90, 'Exam': 100},
    'Sam': {'Test': 65, 'Assignment': 75, 'Exam': 85},
    'Emily': {'Test': 60, 'Assignment': 75, 'Exam': 90}
}

所以grades_list 中的每一行都变成了一个字典;第一列是学生的姓名,其他列是字典中的值,其键取自grades_list 的第一行。

我一直在尝试使用 dict 理解在字典中生成相应的键和值。像这样的:

grade_dicts = {x[0]:{y:z} for y in grades_lists[0][1:] for x in grades_lists[1:] for z in x[1:]}

但这并不能正确生成所有成绩:

{
    'Bella': {'Exam': '100'},
    'Emily': {'Exam': '90'},
    'Sam': {'Exam': '85'}
}

【问题讨论】:

  • 你希望你的字典是什么样子的?
  • ... 创建 dictionarylist 理解?您使用的是字典理解。
  • 您不能创建具有列表理解的字典,不。您正在使用 dictionary 理解。
  • 但这并不能正确生成所有成绩。那么会发生什么,产生什么输出?输出应该是什么样子?
  • @AshBellett:请edit您的问题添加所需的信息。

标签: python list dictionary list-comprehension


【解决方案1】:

你的嵌套搞混了。以下作品:

{name: {col: int(value) for col, value in zip(grades_list[0][1:], row)}
 for name, *row in grades_list[1:]}

for name, *row in ... 循环获取每一行,并仅将第一个值提取到 name 中,将剩余部分提取到 row 中(* 告诉 Python 提取剩余部分)。然后,您可以使用该行与第一行中的列名来创建嵌套字典。

使用常规循环通常更容易看出推导的作用。你的代码是这样做的:

grade_dicts = {}
for y in grades_lists[0][1:]:
    for x in grades_lists[1:]:
        for z in x[1:]:
            grade_dicts[x[0]] = {y:z}

循环太多了,你最终会为x[0] 设置一个值多次; len(x[1:]) 次事实上。只剩下最后一个 {y: z} 字典。

我的版本是这样的:

grade_dicts = {}
for name, *row in grades_list[1:]:
    inner = {}
    for col, value in zip(grades_list[0][1:], row):
        inner[col] = int(value)
    grade_dicts[name] = inner

这只是两个循环,其中内部为每一列生成一个单独的字典。我使用zip() 将标签和值配对。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2021-07-24
    • 1970-01-01
    • 2021-12-07
    • 2011-12-20
    相关资源
    最近更新 更多