【问题标题】:Unexpected Data Assignment in Python Nested DictionariesPython 嵌套字典中的意外数据分配
【发布时间】:2015-12-07 07:15:17
【问题描述】:

我是 python 新手,所以请原谅任何愚蠢的错误,但经过研究,我无法弄清楚这一点。我正在从日历中获取的月份中的天数列表中创建字典。我最初使用dict.fromkeys(),但发现this 提交说服我更改为我拥有的字典理解语句。然后,我将字典中的每个值都赋予另一个字典,该字典以星期几作为键,另一个字典作为值。这本字典是 taskDic,它以家务为键,并将人们的姓名作为值。

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

基本上,我与上面的链接问题有相同的问题,但使用的是嵌套字典。如果我需要澄清任何事情,请告诉我。谢谢!

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...

【问题讨论】:

  • 想要结果是什么?
  • 不要真正了解你的代码发生了什么,也许look at this
  • 请注意,cal[i].keys() != 'Saturday' 不会像您期望的那样做,因为 cal[i].keys() 是一个列表(或列表视图)。
  • @PM2Ring 谢谢。修好了

标签: python dictionary nested


【解决方案1】:

问题出在这里:

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]}

【讨论】:

  • 将此行更改为cal[i] = {week[i % 7]: taskDic.copy()} 即可。
  • @jojonas 不知道该功能。谢谢。
猜你喜欢
  • 2014-10-28
  • 2018-05-31
  • 2018-10-04
  • 2021-02-12
  • 2022-12-05
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 2021-08-24
相关资源
最近更新 更多