【问题标题】:Text formatting, with nested dictionary (Python)文本格式,带有嵌套字典 (Python)
【发布时间】:2019-05-10 11:20:23
【问题描述】:

我想从具有 id+parent 层次结构的 CSV 制作 JSON 树。它有效,但我希望输出略有不同。 而不是只返回:

'childs': { ........... }

我希望它返回:

'childs': { placeholder: 'Select', items: { ........... } }

或者只是:

'childs': { items: { ........... } }

这是我正在使用的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

    import csv
    import re
    from collections import defaultdict
    from pprint import pprint

    parents = defaultdict(list)

    with open('data.csv',encoding="utf8") as csvfile:
        reader = csv.reader(csvfile, delimiter=',', quotechar='"')
        next(reader)
        count = 1
        for row in reader:
            id_, name, admin_level, parent = row
            parents[parent].append((id_, name))
            count += 1

    def build_tree(d, val):
        return {'lc' + id_: {'val': 'lc' + id_, 'txt': name, 'childs': build_tree(d, id_)} for id_, name in d[val]}
    #pprint(build_tree(parents, ''))
    final = str(build_tree(parents, ''))
    print(final.replace(", 'childs': {}", ""))

我使用的 data.csv 是:

@id,name,admin_level,parent_id
295480,Portugal,2,
2897141,Lisboa,3,295480
3920249,Aveiro,3,295480
5011694,Leiria,3,295480
5400843,Loures,4,2897141
5400844,Mafra,4,2897141

目前的输出是:

{'lc295480': {'childs': {'lc2897141': {'childs': {'lc5400843': {'childs': {},
                                                                'txt': 'Loures',
                                                                'val': 'lc5400843'},
                                                  'lc5400844': {'childs': {},
                                                                'txt': 'Mafra',
                                                                'val': 'lc5400844'}},
                                       'txt': 'Lisboa',
                                       'val': 'lc2897141'},
                         'lc3920249': {'childs': {},
                                       'txt': 'Aveiro',
                                       'val': 'lc3920249'},
                         'lc5011694': {'childs': {},
                                       'txt': 'Leiria',
                                       'val': 'lc5011694'}},
              'txt': 'Portugal',
              'val': 'lc295480'}}

【问题讨论】:

    标签: python dictionary recursion text nested


    【解决方案1】:

    替换'childs': build_tree(d, id_)
    'childs' : { 'placeholder': 'Select', 'items' : build_tree(d, id_) }
    或者'childs' : { 'items' : build_tree(d, id_) }

    另外,你替换掉空子键print(final.replace(", 'childs': {}", "")) 是不好的。如果

    {'val': 'lc' + id_, 'txt': name, 'childs': build_tree(d, id_)} 
    

    是这样建造的:

    obj = {'val': 'lc' + id_, 'txt': name}
    childs = build_tree(d, id_)
    if childs:
       obj['childs'] = childs
    

    build_tree 将如下所示:

    def build_tree(d, val):
        d = {}
        for id_, name in d[val]:
            obj = {'val': 'lc' + id_, 'txt': name}
            childs = build_tree(d, id_)
            if childs:
               obj['childs'] = childs
            d['lc' + id_] = obj
        return d
    

    【讨论】:

      猜你喜欢
      • 2020-01-06
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      相关资源
      最近更新 更多