Python: как назначить несколько значений одной клавише - PullRequest
3 голосов
/ 05 ноября 2019

Я извлекаю данные с помощью API и получаю список серверов и резервных копий. Некоторые серверы имеют более одной резервной копии. Вот как я получаю список всех серверов с идентификаторами резервного копирования.

bkplist = requests.get('https://heee.com/1.2/storage/backup')
bkplist_json = bkplist.json()
backup_list = bkplist.json()
backupl = backup_list['storages']['storage']

Json выглядит так:

{
   "storages": {
      "storage": [
         {
            "access": "",
            "created": "",
            "license": ,
            "origin": "01165",
            "size": ,
            "state": "",
            "title": "",
            "type": "backup",
            "uuid": "01019",
            "zone": ""
         },

Сначала я создаю словарь для хранения этих данных:

backup = {}
for u in backup_list['storages']['storage']:
    srvuuidorg = u['origin']
    backup_uuid = u['uuid']
    backup[srvuuidorg] = backup_uuid

Но потом я обнаружил, что для каждого сервера существует более одного значения. Так как словарь может иметь только одно значение, назначенное одной клавише, я хотел использовать гибрид списка и словаря, но я просто не могу понять, как это сделать с этим примером.

Серверы вложены в хранилища -> хранилище , и мне нужно назначить пару uuid , которая является идентификатором резервной копии, одному origin , который является идентификатором сервера.

Я знаю о коллекциях модуле, и на простом примере это вполне понятно, но у меня есть проблема, как использовать это в моем примере для извлечения данных через API.

Как извлечь origin и присвоить этому ключу другие значения, хранящиеся в json uuid ?

Более того, это огромный объем данных, поэтому я не могу добавить каждое значение вручную.

Ответы [ 3 ]

2 голосов
/ 05 ноября 2019

Вы можете сделать что-то вроде этого.

from collections import defaultdict

backup = defaultdict(list)
for u in backup_list['storages']['storage']: 
    srvuuidorg = u['origin'] 
    backup_uuid = u['uuid'] 
    backup[srvuuidorg].append(backup_uuid)

Обратите внимание, что вы можете упростить свой цикл следующим образом.

from collections import defaultdict

backup = defaultdict(list)
for u in backup_list['storages']['storage']:
    backup[u['origin']].append(u['uuid'])

Но это может показаться менее читабельным.

2 голосов
/ 05 ноября 2019

Вы можете сохранить список uuid для ключа origin.

Я предлагаю следующие 2 способа:

  1. Создание пустого list для первого доступа к origin,и затем добавляя к нему:
backup = {}
for u in backup_list['storages']['storage']:
    srvuuidorg = u['origin']
    backup_uuid = u['uuid']
    if not backup.get(srvuuidorg):
        backup[srvuuidorg] = []
    backup[srvuuidorg].append(backup_uuid)
Использование коллекции defaultdict, которая в основном делает то же самое для вас под капотом:
from collections import defaultdict


backup = defaultdict(list)
for u in backup_list['storages']['storage']:
    srvuuidorg = u['origin']
    backup_uuid = u['uuid']
    backup[srvuuidorg].append(backup_uuid)

Мне кажется, что последний способ более элегантен. Если вам нужно сохранить уникальный список uuid, вы должны использовать подход saem с set вместо list.

1 голос
/ 05 ноября 2019

JSON позволяет содержать массив в ключе:

var= {
  "array": [
    {"id": 1, "value": "one"},
    {"id": 2, "value": "two"},
    {"id": 3, "value": "three"}
  ]
}

print var
{'array': [{'id': 1, 'value': 'one'}, {'id': 2, 'value': 'two'}, {'id': 3, 'value': 'three'}]}

var["array"].append({"id": 4, "value": "new"})

print var

{'array': [{'id': 1, 'value': 'one'}, {'id': 2, 'value': 'two'}, {'id': 3, 'value': 'three'}, {'id': 4, 'value': 'new'}]}

...