Как динамически сгруппировать элементы словаря в списки? - PullRequest
0 голосов
/ 01 декабря 2018
I have JSON file as mentioned below,
**test.json**

    {
    "header1" :
       {
           "header1_body1":
              {
               "some_key":"some_value",
                .......................
              },
          "header1_body2":
              {
                "some_key":"some_value",
                 .......................
              }

       },
    "header2":
       {
          "header2_body1":
              {
               "some_key":"some_value",
                .......................
              },
          "header2_body2":
              {
                "some_key":"some_value",
                 .......................
              }
    }
}

Хотите сгруппировать содержимое JSON в списки, как показано ниже:

header1 = ['header1_body1','header1_body2']
header2 = ['header2_body1','header2_body2']

header1, header2 can be till ....header n.Таким образом, динамические списки должны быть созданы с его значениями, как показано выше.

Как я могу добиться этого?Какой оптимальный оптимальный подход?

РЕШЕНИЕ:

with open('test.json') as json_data:
      d = json.load(json_data)

for k,v in d.iteritems():
      if k == "header1" or k == "header2":
            globals()['{}'.format(k)] = d[k].keys()

сейчас, header1 и header2 доступны в виде списка.

for i in header1:
    print i

Ответы [ 5 ]

0 голосов
/ 01 декабря 2018
import json
with open('test.json') as json_data:
          d = json.load(json_data)

for k,v in d.iteritems():
    if k == "header1" or k == "header2":
          globals()['{}'.format(k)] = d[k].keys()

now, `header1` and `header2` can be accessed as list.

    for i in header1:
        print i
0 голосов
/ 01 декабря 2018

Вы можете использовать рекурсию:

d = {'header1': {'header1_body1': {'some_key': 'some_value'}, 'header1_body2': {'some_key': 'some_value'}}, 'header2': {'header2_body1': {'some_key': 'some_value'}, 'header2_body2': {'some_key': 'some_value'}}}
def flatten(_d):
  for a, b in _d.items():
    yield a
    if isinstance(b, dict):
      yield from flatten(b)

new_results = {a:[i for i in flatten(b) if i.startswith(a)] for a, b in d.items()}

Вывод:

{'header1': ['header1_body1', 'header1_body2'], 'header2': ['header2_body1', 'header2_body2']}
0 голосов
/ 01 декабря 2018

Исправление структуры json:

{
"header1" :
   {
       "header1_body1":
          {
           "some_key":"some_value"
          },
      "header1_body2":
          {
            "some_key":"some_value"
          }

   },
"header2":
    {
      "header2_body1":
          {
           "some_key":"some_value"
          },
      "header2_body2":
          {
            "some_key":"some_value"
          }
    }
}

А затем загрузка и создание списков:

header = []

for key, value in dictdump.items():

    header.append(list(value.keys()))

for header_num in range(0, len(header)):
    print("header{} : {}".format(header_num + 1, header[header_num]))

Дает:

header1 : ['header1_body1', 'header1_body2']
header2 : ['header2_body1', 'header2_body2']
0 голосов
/ 01 декабря 2018

Как только вы загрузите свой json, вы можете получить требуемый список для любой клавиши, выполнив что-то вроде следующего (переменная headers, указанная ниже, является заполнителем для вашего загруженного json).Вам не нужно преобразовывать его в список, чтобы работать с ним как с итерацией, но оберните его в list(...), чтобы соответствовать выводу в вашем вопросе.

list(headers['header1'].keys())

Если вам действительно нужно сохранить списокключей для каждого из ваших «заголовочных» диктов в каком-то доступном формате, тогда вы можете создать другой словарь, который содержит списки, которые вы хотите.Например:

import json

data = """{
    "header1" : {
        "header1_body1": {
             "some_key":"some_value"
             },
        "header1_body2": {
            "some_key":"some_value"
            }
        },
    "header2": {
        "header2_body1": {
            "some_key":"some_value"
            },
        "header2_body2": {
            "some_key":"some_value"
            }
        }
    }"""

headers = json.loads(data)

# get the list of keys for a specific header
header = list(headers['header1'].keys())
print(header)
# ['header1_body1', 'header1_body2']

# if you really want to store them in another dict
results = {h[0]: list(h[1].keys()) for h in headers.items()}
print(results)
# OUTPUT
# {'header1': ['header1_body1', 'header1_body2'], 'header2': ['header2_body1', 'header2_body2']}
0 голосов
/ 01 декабря 2018

Предполагая, что вы читаете JSON в переменную d (возможно, используя json.loads ), вы можете перебирать ключи (отсортированные?) И создавать списки с ключами текущего значения:

for key in sorted(d.keys()):
    l = [x for x in sorted(d[key].keys())]  # using list comprehension
    print(key + ' = ' + str(l))
...