Python 嵌套字典中的意外数据分配
Unexpected Data Assignment in Python Nested Dictionaries
我是 python 的新手,所以请原谅任何愚蠢的错误,但经过研究,我无法解决这个问题。我正在根据从日历中获取的月份中的天数列表创建字典。我最初使用 dict.fromkeys()
但发现 this 提交说服我更改为我的字典理解语句。然后我给字典中的每个值另一个字典,以星期几作为键,另一个字典作为值。这个字典是 taskDic,它以 choress 为键,并将人名作为值。
我的问题是我循环中的最后一个语句是每天分配同一个人来处理垃圾(等),即使循环只是在第一天。我认为我开始字典的方式有问题,因为它正在为所有 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...
问题出在这里:
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]}
我是 python 的新手,所以请原谅任何愚蠢的错误,但经过研究,我无法解决这个问题。我正在根据从日历中获取的月份中的天数列表创建字典。我最初使用 dict.fromkeys()
但发现 this 提交说服我更改为我的字典理解语句。然后我给字典中的每个值另一个字典,以星期几作为键,另一个字典作为值。这个字典是 taskDic,它以 choress 为键,并将人名作为值。
我的问题是我循环中的最后一个语句是每天分配同一个人来处理垃圾(等),即使循环只是在第一天。我认为我开始字典的方式有问题,因为它正在为所有 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...
问题出在这里:
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]}