Python:如何给一个键赋多个值

Python: how to assign multiple values to one key

我使用 API 提取数据并检索服务器和备份列表。有些服务器有多个备份。这就是我获取所有具有备份 ID 的服务器列表的方式。

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

但后来我发现每台服务器都有不止一个值。由于字典只能将一个值分配给一个键,所以我想使用列表和字典的某种混合体,但我无法弄清楚如何在这个例子中做到这一点。

服务器嵌套在 storages->storage 中,我需要分配几个 uuid 这是一个 origin 的备份 ID,它是服务器 ID。

我知道 collections 模块,通过一个简单的例子,它是很容易理解的,但是我有一个问题如何在我的例子中使用它通过 [=44= 提取数据].

如何提取 origin 并将存储在 json uuid?

中的其他值分配给此键

而且数据量很大,所以我无法手动添加每个值。

A 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'}]}

你可以这样做。

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'])

但这可能被认为可读性较差。

您可以为 origin 键存储 uuid 列表。

我推荐以下两种方式:

  1. 为第一次访问 origin 创建空 list,然后附加到它:
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)
  1. 使用 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 唯一列表,您应该使用 set 而不是 list.

的 saem 方法

您可以为多个值使用一个列表。

dict = {"Greetings": ["hello", "hi"]}