Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 嵌套字典分配错误-可变字典混淆_Python_Dictionary_Mutable - Fatal编程技术网

Python 嵌套字典分配错误-可变字典混淆

Python 嵌套字典分配错误-可变字典混淆,python,dictionary,mutable,Python,Dictionary,Mutable,我在嵌套字典中的作业上遇到了困难。我有一本嵌套字典,里面有两所学校、三名教师和四名学生。这只是一个玩具的例子,所以我不在乎每个学校的学生和老师都是一样的。不过,我希望每个年级都不一样。但是,根据下面的代码,所有班级和所有学校的所有学生的成绩与上次进入的学校/班级相同 schools = ['School A', 'School B'] teachers = ['mr. smith', 'ms. jones', 'mr. kronk'] students = ['Adam', 'Nick', 'J

我在嵌套字典中的作业上遇到了困难。我有一本嵌套字典,里面有两所学校、三名教师和四名学生。这只是一个玩具的例子,所以我不在乎每个学校的学生和老师都是一样的。不过,我希望每个年级都不一样。但是,根据下面的代码,所有班级和所有学校的所有学生的成绩与上次进入的学校/班级相同

schools = ['School A', 'School B']
teachers = ['mr. smith', 'ms. jones', 'mr. kronk']
students = ['Adam', 'Nick', 'Jeff', 'Dave']
grade_dict ={}
for i in students:
    grade_dict[i] = ''
    for j in teachers:
        teachers_dict[j] = grade_dict
        for k in schools:
            school_dict[k] = teachers_dict
for k in schools:
    for j in teachers:
        for i in students:
            a = [randint(70, 100), randint(70, 100), randint(70, 100)]
            school_dict[k][j][i] = a
这就是我希望数据的样子:

School A mr. smith Adam [71, 72, 82]
School A mr. smith Nick [86, 80, 96]
School A mr. smith Jeff [77, 70, 83]
School A mr. smith Dave [79, 83, 98]
School A ms. jones Adam [70, 98, 87]
School A ms. jones Nick [80, 94, 76]
School A ms. jones Jeff [79, 82, 93]
School A ms. jones Dave [90, 97, 85]
School A mr. kronk Adam [93, 75, 95]
School A mr. kronk Nick [80, 82, 72]
School A mr. kronk Jeff [75, 72, 89]
School A mr. kronk Dave [86, 92, 98]
School B mr. smith Adam [89, 77, 84]
School B mr. smith Nick [93, 71, 74]
School B mr. smith Jeff [78, 83, 83]
School B mr. smith Dave [72, 83, 70]
School B ms. jones Adam [82, 100, 78]
School B ms. jones Nick [80, 89, 100]
School B ms. jones Jeff [91, 81, 77]
School B ms. jones Dave [86, 86, 74]
School B mr. kronk Adam [82, 73, 100]
School B mr. kronk Nick [81, 71, 74]
School B mr. kronk Jeff [92, 100, 90]
School B mr. kronk Dave [86, 97, 85]
不幸的是,对应的字典是这样的:

{'School A': {'mr. kronk': {'Adam': [86, 89, 94],
   'Dave': [74, 85, 86],
   'Jeff': [79, 94, 70],
   'Nick': [90, 80, 97]},
  'mr. smith': {'Adam': [86, 89, 94],
   'Dave': [74, 85, 86],
   'Jeff': [79, 94, 70],
   'Nick': [90, 80, 97]},
  'ms. jones': {'Adam': [86, 89, 94],
   'Dave': [74, 85, 86],
   'Jeff': [79, 94, 70],
   'Nick': [90, 80, 97]}},
 'School B': {'mr. kronk': {'Adam': [86, 89, 94],
   'Dave': [74, 85, 86],
   'Jeff': [79, 94, 70],
   'Nick': [90, 80, 97]},
  'mr. smith': {'Adam': [86, 89, 94],
   'Dave': [74, 85, 86],
   'Jeff': [79, 94, 70],
   'Nick': [90, 80, 97]},
  'ms. jones': {'Adam': [86, 89, 94],
   'Dave': [74, 85, 86],
   'Jeff': [79, 94, 70],
   'Nick': [90, 80, 97]}}}
在stackoverflow上似乎有类似的问题,但它们不能完全帮助我解决这里发生的事情。谢谢

您(重新)在整个dict中使用相同的
grade\u dict
对象。 在每次迭代中创建单独的对象。此外,不需要在每个键处初始化值:

for i in students:
    for j in teachers:
        teachers_dict[j] = {}
        for k in schools:
            school_dict[k] = teachers_dict
另外,您应该通过使用嵌套的
集合声明
school\u dict
来避免使用for预分配值/dict。defaultdict

from collections import defaultdict

school_dict = defaultdict(lambda: school_dict) # dict nesting is recursive

for k in schools:
    for j in teachers:
        for i in students:
            school_dict[k][j][i] = [randint(70, 100), randint(70, 100), randint(70, 100)]

您可以使用字典理解:

from random import randint
schools = ['School A', 'School B']
teachers = ['mr. smith', 'ms. jones', 'mr. kronk']
students = ['Adam', 'Nick', 'Jeff', 'Dave']

final_dict = {school:{teacher:{student:[randint(70, 100), randint(70, 100), randint(70, 100)] for student in students} for teacher in teachers} for school in schools}
输出:

{'School A': {'mr. smith': {'Nick': [75, 81, 86], 'Dave': [85, 88, 84], 'Adam': [78, 95, 99], 'Jeff': [74, 95, 81]}, 'ms. jones': {'Nick': [76, 86, 92], 'Dave': [92, 100, 95], 'Adam': [98, 99, 90], 'Jeff': [74, 100, 95]}, 'mr. kronk': {'Nick': [84, 97, 79], 'Dave': [93, 91, 89], 'Adam': [83, 98, 79], 'Jeff': [89, 83, 99]}}, 'School B': {'mr. smith': {'Nick': [70, 78, 89], 'Dave': [81, 95, 92], 'Adam': [95, 100, 91], 'Jeff': [91, 83, 82]}, 'ms. jones': {'Nick': [94, 85, 75], 'Dave': [99, 77, 94], 'Adam': [79, 97, 92], 'Jeff': [91, 84, 79]}, 'mr. kronk': {'Nick': [81, 90, 86], 'Dave': [72, 95, 82], 'Adam': [80, 73, 77], 'Jeff': [88, 88, 95]}}}

像这样硬编码最终的dict并不是最好的。这是初始化字典的一种很酷的方法(谢谢!),但并不能完全解决在嵌套字典的最低级别创建唯一值的问题。@GeoffPerrin我很抱歉没有意识到您想要随机分配学生分数!请看我最近的编辑。啊,这太棒了!非常感谢你@杰夫佩林很乐意帮忙!如果这个问题对你有帮助,请考虑接受。非常感谢。