4 回答

TA貢獻1847條經驗 獲得超7個贊
模板的每個副本都包含對同一 值字典的引用run
。您需要深層復制來制作可變值的唯一副本:
使用:
import copy direction_map[safe_dir['user']] = copy.deepcopy(template)

TA貢獻1827條經驗 獲得超8個贊
下面應該這樣做 -
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}}])
添加回答
舉報