4 回答
TA贡献1847条经验 获得超7个赞
模板的每个副本都包含对同一 值字典的引用run
。您需要深层复制来制作可变值的唯一副本:
使用:
import copy direction_map[safe_dir['user']] = copy.deepcopy(template)
TA贡献1827条经验 获得超7个赞
下面应该这样做 -
safe_directions = [{'user':'user1', 'direction':'down' }, {'user':'user1', 'direction':'right' }, {'user':'user1', 'direction':'left'}, {'user':'user2', 'direction':'up'}]
l = []
for dic in safe_directions:
if not l or l and l[-1]['user'] != dic['user']:
l.append({'user': dic['user'], 'run': {'up': False, 'down': False, 'right': False, 'left': False}})
l[-1]['run'][dic['direction']] = True
那么l将等于
[{'user': 'user1', 'run': {'up': False, 'down': True, 'right': True, 'left': True}}, {'user': 'user2', 'run': {'up': True, 'down': False, 'right': False, 'left': False}}]
TA贡献1943条经验 获得超7个赞
在这种情况下你应该尝试一下defaultdict。干得好。
from collections import defaultdict
run_template = {'down': False, 'right': False, 'left': False, 'up':False}
def_dict = defaultdict(dict)
for i in safe_directions:
if i['user'] not in def_dict: def_dict[i['user']].update(run_template)
def_dict[i['user']].update({i['direction'] : True})
direction_map = [{k:v} for k,v in def_dict.items()]
print(direction_map)
TA贡献1825条经验 获得超6个赞
阅读文档。 copy只是一个浅层副本:深一层。第一级下的所有内容都是参考。因此,user1和user2共享相同的子字典。
import copy
...
direction_map[safe_dir['user']] = copy.deepcopy(template)
输出:
{'user': 'user1', 'run': {'up': False, 'down': True, 'right': False, 'left': False}}
{'user': 'user1', 'run': {'up': False, 'down': True, 'right': True, 'left': False}}
{'user': 'user1', 'run': {'up': False, 'down': True, 'right': True, 'left': True}}
{'user': 'user2', 'run': {'up': True, 'down': False, 'right': False, 'left': False}}
dict_values([{'user': 'user1', 'run': {'up': False, 'down': True, 'right': True, 'left': True}}, {'user': 'user2', 'run': {'up': True, 'down': False, 'right': False, 'left': False}}])
添加回答
举报