Доступ к словарю с элементами из мягкого кода массива - PullRequest
0 голосов
/ 23 ноября 2018

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

{
  "name": "Chiel",
  "industry": {
    "IndustryName": "Computer Science",
    "company": {
      "companyName": "Apple",
      "address": {
        "streetName": "Apple Park Way",
        "streetNumber": "1"
      }
    }
  },
  "hobby": {
    "hobbyName": "Music production",
    "genre": {
      "genreName": "Deep house",
      "genreYearOrigin": "1980"
    }
  }
}

См. Следующий пример кода:

#create dict
jsonData = '{"name":"Chiel","industry":{"IndustryName":"Computer Science","company":{"companyName":"Apple","address":{"streetName":"Apple Park Way","streetNumber":"1"}}},"hobby":{"hobbyName":"Music production","genre":{"genreName":"Deep house","genreYearOrigin":"1980"}}}'
dictionary = json.loads(jsonData)

#Referencing dict for 'streetName', from array, hardcoded.    
companyElements = ["industry", "company", "address", "streetName"]
print(dictionary[companyElements[0]][companyElements[1]][companyElements[2]][companyElements[3]])

#Referencing dict for 'genreName', from array, hardcoded.    
hobbyElements = ["hobby", "genre", "genreName"]
print(dictionary[hobbyElements[0]][hobbyElements[1]][hobbyElements[2]])

Проблема в том, что доступ к словарям осуществляется в жестком коде.Другими словами, используются числа (0, 1, 2, 3).

Возможно ли получить доступ к словарю через массив, но с мягким кодом?Таким образом, передача в массив (или другую структуру данных) в диктат без использования чисел?Если так, как можно этого достичь?

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Вы можете написать функцию, которая выполняет итерацию заданных ключей.

Помните, что следующая реализация не будет перехватывать исключения, если в вашем JSON отсутствует один или несколько ключей:

import json
import copy
#create dict
jsonData = '{"name":"Chiel","industry":{"IndustryName":"Computer Science","company":{"companyName":"Apple","address":{"streetName":"Apple Park Way","streetNumber":"1"}}},"hobby":{"hobbyName":"Music production","genre":{"genreName":"Deep house","genreYearOrigin":"1980"}}}'
dictionary = json.loads(jsonData)

#Referencing dict for 'streetName', from array, hardcoded.
companyElements = ["industry", "company", "address", "streetName"]

#Referencing dict for 'genreName', from array, hardcoded.
hobbyElements = ["hobby", "genre", "genreName"]

def get_dict_value(data, keys):
    result = copy.deepcopy(data)
    for key in keys:
        result = result[key]
    return result

print( get_dict_value(dictionary, companyElements) )
print( get_dict_value(dictionary, hobbyElements) )

Результат:

Apple Park Way
Deep house
0 голосов
/ 23 ноября 2018

Вы можете использовать библиотеку панд.Он очень эффективно обрабатывает файловые операции в Python, потому что он написан на C. Для этой задачи вы можете использовать функцию json_normalize в Pandas.

Reference - https://www.kaggle.com/jboysen/quick-tutorial-flatten-nested-json-in-pandas

import json
file=open('kk.json')
inp=json.load(file)
print(json_normalize(inp))
0 голосов
/ 23 ноября 2018

Возможное решение (из приведенного вами примера):

def get_element(dictionary, array):
   x = dictionary.copy()
   for i in array:
      x = x[i]
   return x

companyElements = ["industry", "company", "address", "streetName"]
hobbyElements = ["hobby", "genre", "genreName"]

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