为了账号安全,请及时绑定邮箱和手机立即绑定

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条经验 获得超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}}]



查看完整回答
反对 回复 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 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信