У меня есть сценарий, который создает несколько словарей и объединяет их в один словарь для возврата к вызывающему объекту. Требование состоит в том, чтобы добавлять каждый словарь в конец предыдущего. Пока я собирал его на своем ПК (Windows 10, python 3.x), он работал нормально, как показано ниже.
{
"Array Name": "SU73ARWVSPF01",
"storageSystemId": "22186",
"storageSystemName": "POD5_SU73ARWVSPF01",
"accessible": true,
"model": "VSP G1500",
"svpIpAddress": "10.185.35.37",
"firmwareVersion": "80-06-78-00/00",
"lastRefreshedTime": "2020-12-21 14:45:31",
"Pool List": {
"Pool-1": {
"storagePoolId": 11,
"label": "DATA",
"capacityInBytes": 590323982008320,
"usedCapacityInBytes": 422152148877312,
"availableCapacityInBytes": 168171833131008,
"usedSubscription": 83
},
"Pool-2": {
"storagePoolId": 12,
"label": "LOGS",
"capacityInBytes": 28142827732992,
"usedCapacityInBytes": 21991601995776,
"availableCapacityInBytes": 6151225737216,
"usedSubscription": 78
}
},
"SNMP Manager List": {
"SNMP-1": {
"name": "Test",
"ipAddress": "1.1.1.1"
},
"SNMP-2": {
"name": "Test1",
"ipAddress": "2.2.2.2"
}
},
"Hardware Alert List": {
"diskAlerts": false,
"powerSupplyAlerts": false,
"batteryAlerts": false,
"fanAlerts": false,
"portAlerts": false,
"cacheAlerts": false,
"memoryAlerts": false,
"processorAlerts": false
}
}
Однако после перемещения его на сервер, где будет работать фактическая программа (RHEL 7, python 2.7), порядок словаря искажается, как показано ниже.
{
"accessible": true,
"storageSystemName": "POD5_SU73ARWVSPF01",
"Hardware Alert List": {
"cacheAlerts": false,
"powerSupplyAlerts": false,
"portAlerts": false,
"processorAlerts": false,
"batteryAlerts": false,
"diskAlerts": false,
"fanAlerts": false,
"memoryAlerts": false
},
"SNMP Manager List": {
"SNMP-1": {
"ipAddress": "1.1.1.1",
"name": "Test"
},
"SNMP-2": {
"ipAddress": "2.2.2.2",
"name": "Test1"
}
},
"svpIpAddress": "10.185.35.37",
"storageSystemId": "22186",
"Array Name": "SU73ARWVSPF01",
"lastRefreshedTime": "2020-12-21 21:45:31",
"model": "VSP G1500",
"Pool List": {
"Pool-2": {
"usedSubscription": 78,
"label": "LOGS",
"usedCapacityInBytes": 21991601995776,
"storagePoolId": 12,
"availableCapacityInBytes": 6151225737216,
"capacityInBytes": 28142827732992
},
"Pool-1": {
"usedSubscription": 83,
"label": "DATA",
"usedCapacityInBytes": 422152148877312,
"storagePoolId": 11,
"availableCapacityInBytes": 168171833131008,
"capacityInBytes": 590323982008320
}
},
"firmwareVersion": "80-06-78-00/00"
}
Вывод из первого таков, как я хотел и запрограммировал, используя
OUTPUT = {}
OUTPUT.update(new Dict1), OUTPUT.update(new Dict2).... etc
Есть ли способ избежать вставки словарей в середину другого, а не в его конец?
Если вы заботитесь о порядке, вы должны использовать списки, а не словари.
Словари сохраняли порядок элементов, добавленных к ним официально, до версии 3.7 - так что это похоже на причину - но, как сказал @Barmar, это не должно иметь значения.
@martineau Они помнят порядок вставки, непонятно, как это относится к слиянию с .update()
.
@Barmar: Когда updates
изменяет значение чего-то, что уже находится в dict
, порядок этих элементов не меняется, если элемент новый, он добавляется в текущий конец. Я думаю, что это может быть где-то в документации…
Правильно, и я полагаю, что описание того, что они пытаются сделать, подразумевает, что каждый входной словарь имеет разные ключи.
Спасибо всем за участие..
Словари Python, поддерживающие свой порядок вставки, были функцией только начиная с Python 3.6 (хотя тогда они были лишь деталью реализации; альтернативные реализации Python не должны были придерживаться этого). Начиная с Python 3.7 это стало спецификацией языка.
Поскольку вы используете Python 2.7 на своем сервере, порядок словаря не гарантируется при использовании класса dict
по умолчанию. Вы можете использовать класс collections.OrderedDict , чтобы обеспечить запоминание порядка вставки.
Порядок элементов словаря не должен иметь значения.