Форматирование текста, с вложенным словарем (Python) - PullRequest
0 голосов
/ 09 декабря 2018

Я хочу создать дерево JSON из CSV с иерархией id + parent.Это работает, но я хочу, чтобы вывод немного отличался.Вместо того, чтобы возвращать просто:

'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'}}

1 Ответ

0 голосов
/ 09 декабря 2018

Заменить '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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...