Python 字典复制

我正在尝试将字典列表从一种格式转换为另一种格式:


输入格式:


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的单个引用。有人可以提出任何建议吗?


子衿沉夜
浏览 125回答 4
4回答

aluckdog

模板的每个副本都包含对同一 值字典的引用run。您需要深层复制来制作可变值的唯一副本:使用:import copy direction_map[safe_dir['user']] = copy.deepcopy(template)

慕仙森

下面应该这样做 -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}}]

杨__羊羊

在这种情况下你应该尝试一下defaultdict。干得好。from collections import defaultdictrun_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)

胡子哥哥

阅读文档。 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}}])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python