Python嵌套字典中的意外数据分配

发布于 2021-01-29 15:03:51

我是python的新手,所以请原谅任何愚蠢的错误,但是经过研究,我无法弄清楚。我正在根据日历中月份中的几天列表创建字典。我最初使用过,dict.fromkeys()但发现提交使我确信更改为我拥有的字典理解语句。然后,我给字典中的每个值分配另一个字典,该字典以星期几作为键,另一个字典作为值。这本词典是taskDic,以家务作为键,将人的名字作为值。

我的问题是,即使循环只是在第一天,循环中的最后一条语句仍每天分配同一个人进行垃圾处理(等)。我相信启动字典的方式有问题,因为它为所有dic分配值就好像它们是相同的一样。

基本上,我有与上面的链接问题相同的问题,但带有嵌套字典。请让我知道是否需要澄清任何事情。谢谢!

import calendar

week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
taskDic = {'Trash':[], 'Groceries':[], 'Clean':[]} 
teamList = ['Jane', 'Peter', 'Jake', 'Eliza', 'Sarah', 'Bill']
person = 0

cal = list(calendar.Calendar().itermonthdays(2015, 8))
cal = {k: {} for k in cal}

for i in cal:
    cal[i] = {week[i % 7]: taskDic}

for i in cal:  
     if (cal[i].keys() != 'Saturday') and (cal[i].keys() != 'Sunday'):
         for j in cal[i]:   
              for k in cal[i][j]:  
                cal[i][j][k] = teamList[person % len(teamList)]
                person += 1

我的结果看起来像这样:

0 {'Monday': {'Trash': 'Eliza', 'Groceries': 'Sarah', 'Clean': 'Bill'}}
1 {'Tuesday': {'Trash': 'Eliza', 'Groceries': 'Sarah', 'Clean': 'Bill'}}
2 {'Wednesday': {'Trash': 'Eliza', 'Groceries': 'Sarah', 'Clean': 'Bill'}}
3 {'Thursday': {'Trash': 'Eliza', 'Groceries': 'Sarah', 'Clean': 'Bill'}}
etc...
关注者
0
被浏览
72
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    问题在这里:

    for i in cal:
        cal[i] = {week[i % 7]: taskDic}
    

    taskDic每天都使用相同的副本。

    正如@jojonas所评论的那样,解决方法是:

    cal[i] = {week[i % 7]: taskDic.copy()}
    

    唯一的问题是,您最终将创建一堆未使用的副本,这对于此任务很合适。

    您想要做的是这样的:

    week_of_tasks = [taskDic.copy() for _ in week]
    cal[i] = {week[i % 7]: week_of_tasks[i % 7]}
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看