Групповые значения в файле json

#python #json #dictionary

Вопрос:

У меня есть файл json, подобный этому:

 {
  "PMID": {
    "0": 31920716.0,
    "1": 31915546.0,
    "2": 31912059.0,
    "3": 31908815.0
},
"ArticleTitle": {
    "0": "Clinical Usefulness of Computational Modeling-Guided Persistent Atrial Fibrillation Ablation: Updated Outcome of Multicenter Randomized Study.",
    "1": "Prevalence and Progression of Cognitive Impairment in Atrial Fibrillation Patients after Treatment with Catheter Ablation or Drug Therapy.",
    "2": "Non traumatic spinal epidural haematoma.",
    "3": "Twelve-month outcome in patients with stroke and atrial fibrillation not suitable to oral anticoagulant strategy: the WATCH-AF registry."
},
 "Authors": {
    "0": [
      "Kim IS",
      "Uhm JS",
    ],
    "1": [
      "Ortak J",
      "Caglayan E"
    ],
    "2": [
      "Khalid NA",
      "Shah N"
    ],
    "3": [
      "Nighoghossian N",
      "Amarenco P"
    ]
  }
}

 

и я хочу сгруппировать ценности таким образом:

 {
"0": {
       "PMID": 31920716.0,
       "ArticleTitle": "Clinical Usefulness of Computational Modeling-Guided Persistent Atrial Fibrillation Ablation: Updated Outcome of Multicenter Randomized Study.",
       "Authors" : [
      "Kim IS",
      "Uhm JS",
    ],
}

 

и так далее, по позиции в словаре, чтобы получить элемент со всеми сгруппированными индексами.
Есть ли функция для выполнения этой операции в Python?

Комментарии:

1. Я хотел бы напомнить всем, кто задает подобные вопросы о JSON, что на самом деле вопрос не обязательно должен касаться JSON-Вместо этого, как вы можете видеть в данном ответе, речь идет о манипулировании «собственными» структурами данных в Python, из которых JSON десериализуется/сериализуется. Удаление JSON из вопроса может помочь в будущем, когда вы начнете искать ответы 🙂

2. {k: dict(i) for k, i in groupby(sorted(([n, i, k] for n, g in d.items() for k, i in g.items()), key=itemgetter(-1)), list.pop)} groupby() itemgetter()

Ответ №1:

Вы можете создать словарь и продолжать обновлять его в том порядке, в котором вам нравится . Следующий код объясняет это

 def pack_ordinal(data):
    result = dict()
    for i in data:
        for j in data[i]:
            result[j] = result.get(j, dict())
            result[j][i] = data[i][j]
    return result
 

Комментарии:

1. Чаще всего выполняется итерация по парам ключ-значение: for k, v in data.items() , for k_i, v_i in v.items() . Также вы можете использовать defaultdict и обходить инициализацию dict result = defaultdict(dict) . Все вместе это сделает код немного чище (имхо) . Код .