我使用API提取数据并检索服务器和备份的列表。某些服务器有多个备份。这就是我获取所有具有backaup 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
但后来我发现每个服务器都有不止一个值。由于dictionary只能为一个键分配一个值,我想使用列表和dictionary的混合,但我不知道如何用这个例子来实现这一点。
服务器嵌套在存储->存储器中,我需要将两个uuid(备份ID(分配给一个源,后者是服务器ID。
我知道集合模块,通过一个简单的示例,这是可以理解的,但我在通过API提取数据的示例中遇到了如何使用它的问题。
如何提取origin并将存储在jsonuuid中的其他值分配给该键?
更重要的是,这是一个巨大的数据量,所以我不能手动添加每个值。
您可以这样做。
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
列表。
我建议以下两种方法:
- 创建空的
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
唯一列表,则应使用带有set
而不是list
的saem方法。
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'}]}
您可以使用多个值的列表。
dict = {"Greetings": ["hello", "hi"]}