首页 > 解决方案 > Python:如何为一个键分配多个值

问题描述

我使用 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中,我需要将几个作为备份 ID的uuid分配给一个作为服务器 ID的源。

我知道集合模块,并且通过一个简单的示例可以理解,但是我有一个问题,如何在我的示例中使用它来通过 API 提取数据。

如何提取原点并将存储在 json uuid中的其他值分配给该键?

更重要的是,它是海量数据,所以我无法手动添加每个值。

标签: pythonjsonapidata-extraction

解决方案


你可以做这样的事情。

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

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


推荐阅读