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

python list 转成 json 格式怎么高效?

  •  
  •   coolair · 2016-11-14 21:04:44 +08:00 · 5830 次点击
    这是一个创建于 2923 天前的主题,其中的信息可能已经有所发展或是发生改变。
    list 列表如下:
    a=[
    {'group_id': 1, 'group_name': 'group_1','item_id': 1, 'item_name': 'test_1'},
    {'group_id': 1, 'group_name': 'group_1','item_id': 2, 'item_name': 'test_2'},
    {'group_id': 1, 'group_name': 'group_1','item_id': 3, 'item_name': 'test_3'},
    {'group_id': 2, 'group_name': 'group_2','item_id': 4, 'item_name': 'test_4'},
    {'group_id': 2, 'group_name': 'group_2','item_id': 5, 'item_name': 'test_5'},
    {'group_id': 2, 'group_name': 'group_2','item_id': 6, 'item_name': 'test_6'},
    ]

    需要转化成的 json 格式如下:
    [
    {
    'group_id': 1,
    'group_name': 'group_1'
    'items': [{'item_id': 1, 'item_name': 'test_1'}, {'item_id': 2, 'item_name': 'test_2'}]
    },
    {
    'group_id': 2,
    'group_name': 'group_2'
    'items': [{'item_id': 4, 'item_name': 'test_4'}, {'item_id': 5, 'item_name': 'test_5'}]
    },
    ]

    先讲下我的实现方法:
    我是先用 group_id 作 key 生成一个字典,再遍历一遍这个字典,然后再排序一下,我觉得我这种做法不对啊,有没有更高效的方法?
    9 条回复    2016-11-14 22:12:56 +08:00
    binux
        1
    binux  
       2016-11-14 21:10:39 +08:00
    a 有序吗?
    coolair
        2
    coolair  
    OP
       2016-11-14 21:14:37 +08:00
    @binux a 有序的,先按 group_id 排,再按 item_id 排,我那样弄,就循环遍历了几遍。
    binux
        3
    binux  
       2016-11-14 21:16:35 +08:00
    @coolair 用 OrderedDict ,不用再排序
    coolair
        4
    coolair  
    OP
       2016-11-14 21:32:42 +08:00
    @binux OrderedDict 不是试用在这种情况下吧,用他还得遍历 3 遍?
    binux
        5
    binux  
       2016-11-14 21:37:00 +08:00
    @coolair 你的 a 不是有序的吗,插入 OrderedDict 之后,取出来依旧有序,就不用重新排序了。
    (其实更好的办法是 current_group_id 做状态转移)
    coolair
        6
    coolair  
    OP
       2016-11-14 21:46:44 +08:00
    @binux 不是很明白啊,我现在这个 list 本来就是有序的,插入 OrderedDict 就变成:
    {group_id: [course_id, ], } 这样不就丢了元素了么?
    binux
        7
    binux  
       2016-11-14 21:55:19 +08:00
    @coolair course_id 是什么东西?你「用 group_id 作 key 生成一个字典,再遍历一遍这个字典,然后再排序一下」不丢元素,「用 group_id 作 key 生成一个 OrderedDict ,再遍历一遍这个字典」为什么会丢元素?
    dant
        8
    dant  
       2016-11-14 21:56:08 +08:00
    itertools.groupby()
    coolair
        9
    coolair  
    OP
       2016-11-14 22:12:56 +08:00
    @binux 写错了,应该是 item ,你这种方法我回去再试试,谢谢!
    @dant 谢谢,用这个方法写好了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2844 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:40 · PVG 10:40 · LAX 18:40 · JFK 21:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.