亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python 字典復制

Python 字典復制

子衿沉夜 2023-12-29 16:52:13
我正在嘗試將字典列表從一種格式轉換為另一種格式:輸入格式:safe_directions = [{'user':'user1', 'direction':'down' }, {'user':'user1', 'direction':'right' }, {'user':'user1', 'direction':'left'}, {'user':'user2', 'direction':'up'}]我正在嘗試將其轉換為:輸出 :[{'user':'user1', 'run': {'up':False, 'down':True, 'right':True, 'left':True} },{'user':'user2',  'run': { 'up':True, 'down':False, 'right':False, 'left':False} }]我正在嘗試對此進行轉換,但我覺得自己被 python 對象引用困住了。最終 user2 的所有運行都標記為 True。這是我的代碼:def is_safe():    template = {'user':None,                    'run':{                        'up':False,                        'down':False,                        'right':False,                        'left':False                    }    }    safe_directions = [{'user':'user1', 'direction':'down' }, {'user':'user1', 'direction':'right' }, {'user':'user1', 'direction':'left'}, {'user':'user2', 'direction':'up'}]    direction_map = {}    if not safe_dir['user'] in direction_map.keys():        direction_map[safe_dir['user']] = template.copy()    # The above line seems does not create new copy?    print(direction_map.values())我的輸出:[{'user': 'user1', 'run': {'up': True, 'down': True, 'right': True, 'left': True}}, {'user': 'user2', 'run': {'up': True, 'down': True, 'right': True, 'left': True}}]在這里,我所有的跑步/方向在 Direction_map 目錄中都變為 true。調試代碼后發現僅維護了currrent_dir的單個引用。有人可以提出任何建議嗎?
查看完整描述

4 回答

?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

模板的每個副本都包含對同一 值字典的引用run。您需要深層復制來制作可變值的唯一副本:

使用:

import copy
direction_map[safe_dir['user']] = copy.deepcopy(template)


查看完整回答
反對 回復 2023-12-29
?
慕仙森

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



查看完整回答
反對 回復 2023-12-29
?
楊__羊羊

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)


查看完整回答
反對 回復 2023-12-29
?
胡子哥哥

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



查看完整回答
反對 回復 2023-12-29
  • 4 回答
  • 0 關注
  • 279 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號