Написание словарей рекурсивно - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть файл JSON с данными о местоположении.Ниже приведен пример из файла.

[
{
    "id": 1,
    "name": "Western Cape",
    "filename": "1",
    "type": "Province",
    "typeCode": 1
},
{
    "id": 2,
    "name": "Eastern Cape",
    "filename": "2",
    "type": "Province",
    "typeCode": 1
},
{
    "id": 3,
    "name": "Northern Cape",
    "filename": "3",
    "type": "Province",
    "typeCode": 1
},
{
    "id": 4,
    "name": "Free State",
    "filename": "4",
    "type": "Province",
    "typeCode": 1
},
{
    "id": 5,
    "name": "KwaZulu-Natal",
    "filename": "5",
    "type": "Province",
    "typeCode": 1
},
{
    "id": 6,
    "name": "North West",
    "filename": "6",
    "type": "Province",
    "typeCode": 1
},
{
    "id": 7,
    "name": "Gauteng",
    "filename": "7",
    "type": "Province",
    "typeCode": 1
},
{
    "id": 8,
    "name": "Mpumalanga",
    "filename": "8",
    "type": "Province",
    "typeCode": 1
},
{
    "id": 9,
    "name": "Limpopo",
    "filename": "9",
    "type": "Province",
    "typeCode": 1
},
{
    "id": 199,
    "name": "City of Cape Town",
    "filename": "1.199",
    "type": "Metropolitan Municipality",
    "typeCode": 2,
    "parent": 1
},
{
    "id": 260,
    "name": "Buffalo City",
    "filename": "2.260",
    "type": "Metropolitan Municipality",
    "typeCode": 2,
    "parent": 2
},
{
    "id": 299,
    "name": "Nelson Mandela Bay",
    "filename": "2.299",
    "type": "Metropolitan Municipality",
    "typeCode": 2,
    "parent": 2
},
{
    "id": 499,
    "name": "Mangaung",
    "filename": "4.499",
    "type": "Metropolitan Municipality",
    "typeCode": 2,
    "parent": 4
},
{
    "id": 599,
    "name": "eThekwini",
    "filename": "5.599",
    "type": "Metropolitan Municipality",
    "typeCode": 2,
    "parent": 5
},
{
    "id": 797,
    "name": "Ekurhuleni",
    "filename": "7.797",
    "type": "Metropolitan Municipality",
    "typeCode": 2,
    "parent": 7
},
{
    "id": 798,
    "name": "City of Johannesburg",
    "filename": "7.798",
    "type": "Metropolitan Municipality",
    "typeCode": 2,
    "parent": 7
},
{
    "id": 799,
    "name": "City of Tshwane",
    "filename": "7.799",
    "type": "Metropolitan Municipality",
    "typeCode": 2,
    "parent": 7
}]

Я хочу получить следующий вывод:

{'Eastern Cape': {u'Buffalo City': {}, u'Nelson Mandela Bay': {}}, 'Gauteng': {u'Ekurhuleni': {}, u'City of Johannesburg': {}, u'City of Tshwane': {}}, 'North West': {}, 'Mpumalanga': {}, 'Limpopo': {}, 'Western Cape': {u'City of Cape Town': {}}, 'KwaZulu-Natal': {u'eThekwini': {}}, 'Northern Cape': {}, 'Free State': {u'Mangaung': {}}}

Я написал следующий блок кода для достижения этого:

province_dict = {}
final_dict = {
    'Western Cape': {},
    'Eastern Cape': {},
    'Northern Cape': {},
    'Free State': {},
    'KwaZulu-Natal': {},
    'North West': {},
    'Gauteng': {},
    'Mpumalanga': {},
    'Limpopo': {},
}

for item in data:
    if item['type'] == 'Province':
        province_dict.update({item['id']: item['name']})

for item in data:
    if item['type'] != 'Province':
        if item['parent'] in province_dict.keys():
            final_dict[province_dict[item['parent']]].update({item['name']: {}})


print final_dict

Однако, похоже, есть некоторые проблемы:

  1. Это не самый питонский способ достижения этого.
  2. Я не ограничен провинцией и муниципалитетом города,У меня также есть районные муниципалитеты и так далее.Однако все они подчиняются одним и тем же правилам: у каждого ребенка есть родительский идентификатор, причем провинция является корнем.
  3. Мне нужно создать иерархическую структуру, как указано выше, с n числом возможных вложений.

Было бы полезно, если бы кто-то мог помочь мне достичь этого.

1 Ответ

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

Я думаю, вы можете создать абстрактный тип данных , чтобы сделать это эффективно.У вас может быть класс ADT, использующий словарь, и вы можете дать ему другое свойство.

Это просто псевдокодирование.В настоящее время у меня нет времени на создание полностью функционального класса, но я думаю, что это поможет.

class SomeClass:
    _parents = {}
    _children = {}

    def add_obj(self, obj):
        if obj.noParent:
            self._parents[obj.get_id] = obj

        else:
            self._children[obj.get_id] = obj

    def to_string(self, id):
        for v1 in (self._parents if id is None else self._parents.get(id)):
            if v1.get_id in self._parents.keys():
                print(self.to_string(v1.get_id()))
            for v2 in self._children.get(id):
                print(v2.stuff)

Если вы все еще боретесь, когда у меня есть время сегодня или завтра, я 'Я вернусь к этому ответу и посмотрю, смогу ли я сделать его функциональным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...