V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mishi200
V2EX  ›  问与答

python3 嵌套循环同一个字典,尽然循环出 3 个点点,百思不得其解!引用数据类型出错, WHY?

  •  
  •   mishi200 · 2018-08-30 08:36:21 +08:00 · 514 次点击
    这是一个创建于 2077 天前的主题,其中的信息可能已经有所发展或是发生改变。
    描述:如下 msg_list 列表是为了实现多级评论的一个源数据结构,希望将此数据结构改造为可用于分级展示的数据结构。
    思路:列表,字典都是属于引用类型的数据结构,即同一份数据不会被复制,而是以内存地址的方式引用的。

    代码:
    msg_list = [
    {'id':1,'content':'好','parent_id':None},
    {'id':2,'content':'不','parent_id':None},
    {'id':3,'content':'啥','parent_id':None},
    {'id':4,'content':'牛','parent_id':1},
    {'id':5,'content':'马','parent_id':4},
    {'id':6,'content':'兔','parent_id':2},
    {'id':7,'content':'羊','parent_id':5},
    {'id':8,'content':'犬','parent_id':3},
    {'id':9,'content':'花','parent_id':1},
    ]

    [row.setdefault('children',[]) for row in msg_list]


    for item in msg_list:
    if item['parent_id']:
    for i in msg_list:
    if item['id'] == i['id']:
    i['children'].append(item)

    for v in msg_list:
    print(v)

    执行结果:为什么列表中的字典是 [ 3 个点点] ???
    {'id': 1, 'content': '好', 'parent_id': None, 'children': []}
    {'id': 2, 'content': '不', 'parent_id': None, 'children': []}
    {'id': 3, 'content': '啥', 'parent_id': None, 'children': []}
    {'id': 4, 'content': '牛', 'parent_id': 1, 'children': [{...}]}
    {'id': 5, 'content': '马', 'parent_id': 4, 'children': [{...}]}
    {'id': 6, 'content': '兔', 'parent_id': 2, 'children': [{...}]}
    {'id': 7, 'content': '羊', 'parent_id': 5, 'children': [{...}]}
    {'id': 8, 'content': '犬', 'parent_id': 3, 'children': [{...}]}
    {'id': 9, 'content': '花', 'parent_id': 1, 'children': [{...}]}

    应该得到的结果:
    {'id': 1, 'content': '好', 'parent_id': None, 'children': [{'id': 4, 'content': '牛', 'parent_id': 1, 'children': [{'id': 5, 'content': '马', 'parent_id': 4, 'children': [{'id': 7, 'content': '羊', 'parent_id': 5, 'children': []}]}]}, {'id': 9, 'content': '花', 'parent_id': 1, 'children': []}]}
    {'id': 2, 'content': '不', 'parent_id': None, 'children': [{'id': 6, 'content': '兔', 'parent_id': 2, 'children': []}]}
    {'id': 3, 'content': '啥', 'parent_id': None, 'children': [{'id': 8, 'content': '犬', 'parent_id': 3, 'children': []}]}
    {'id': 4, 'content': '牛', 'parent_id': 1, 'children': [{'id': 5, 'content': '马', 'parent_id': 4, 'children': [{'id': 7, 'content': '羊', 'parent_id': 5, 'children': []}]}]}
    {'id': 5, 'content': '马', 'parent_id': 4, 'children': [{'id': 7, 'content': '羊', 'parent_id': 5, 'children': []}]}
    {'id': 6, 'content': '兔', 'parent_id': 2, 'children': []}
    {'id': 7, 'content': '羊', 'parent_id': 5, 'children': []}
    {'id': 8, 'content': '犬', 'parent_id': 3, 'children': []}
    {'id': 9, 'content': '花', 'parent_id': 1, 'children': []}


    另一种测试通过的代码供参考:
    msg_list = [
    {'id': 1, 'content': '好', 'parent_id': None},
    {'id': 2, 'content': '不', 'parent_id': None},
    {'id': 3, 'content': '啥', 'parent_id': None},
    {'id': 4, 'content': '牛', 'parent_id': 1},
    {'id': 5, 'content': '马', 'parent_id': 4},
    {'id': 6, 'content': '兔', 'parent_id': 2},
    {'id': 7, 'content': '羊', 'parent_id': 5},
    {'id': 8, 'content': '犬', 'parent_id': 3},
    {'id': 9, 'content': '花', 'parent_id': 1},
    ]

    msg_list_dic = {
    # 1:{'id':1,'content':'xxx','parent_id':None,'children':[]},
    # 2:{'id':1,'content':'xxx','parent_id':None,'children':[]},
    }

    for item in msg_list:
    item['children'] = [] # 将源数添加一个 key
    msg_list_dic[item['id']] = item # 引用源数据

    result = []
    for item in msg_list:
    pid = item['parent_id']
    if pid:
    # 一次就找到了需要在 msg_list 中循环才能找到的数据(原理是数据引用)
    msg_list_dic[pid]['children'].append(item)
    else:
    result.append(item)

    # print(msg_list)
    for v in msg_list:
    print(v)
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   6089 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:53 · PVG 09:53 · LAX 18:53 · JFK 21:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.