Установите внутренние значения в словарях python без объявления нескольких пустых словарей

Допустим, у меня есть словарь вроде

      ship = {'AddNewShipmentV3': {'oShipData': {'ReadyDate': '2021-01-11T12:00:00', 'CloseTime': '2021-01-11T08:12:34', 'ServiceLevel': 'EC', 'ShipperName': 'Test 1/12/2021','SpecialInstructions': 'Invoice - RMA#S, 7800401086-GOOD EQUIP Pickup - DRIVER WILL NEED SHRINK WRAP FOR 2 PALLETS PLEASE CALL', 'Station': 'SLC', 'CustomerNo': '9468', 'BillToAcct': '9468', 'DeclaredType': 'LL'}}}

Я хочу создать новый словарь (b), извлекая значение ReadyDate и сохраняя его как значение ReadyTime и CLoseTime и сохраняя его в CloseDate. и я хочу добавить эти новые пары ключ-значение в начало словаря. я пробовал это

      def ready_date_time(a):
 b = {}
 b["AddNewShipmentV3"] = {}
 b["AddNewShipmentV3"]["oShipData"] = {}
 b["AddNewShipmentV3"]["oShipData"]["ReadyTime"] = a["AddNewShipmentV3"]["oShipData"]["ReadyDate"]
    
 if "CloseTime" in a["AddNewShipmentV3"]["oShipData"]:
    b["AddNewShipmentV3"]["oShipData"]["CloseDate"] = a["AddNewShipmentV3"]["oShipData"]["CloseTime"]    
 else:
    pass           
 # this will create a new dictionary (b) with new values "CloseDate" and "ReadyTime" in the starting 
 of the dictionary
 b["AddNewShipmentV3"]["oShipData"].update(a["AddNewShipmentV3"]["oShipData"])    
 return b
 
read_date_time(ship)

Мой вывод:

      {'AddNewShipmentV3': {'oShipData': {'ReadyTime': '2021-01-11T12:00:00', 'CloseDate': '2021-01-11T08:12:34', 'ReadyDate': '2021-01-11T12:00:00', 'CloseTime': '2021-01-11T08:12:34', 'ServiceLevel': 'EC', 'ShipperName': 'Test 1/12/2021', 'SpecialInstructions': 'Invoice - RMA#S, 7800401086-GOOD EQUIP Pickup - DRIVER WILL NEED SHRINK WRAP FOR 2 PALLETS PLEASE CALL', 'Station': 'SLC', 'CustomerNo': '9468', 'BillToAcct': '9468', 'DeclaredType': 'LL'}}}

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

1 ответ

Это можно сделать с помощью класса defaultdict из коллекций python.

      from collections import defaultdict

d = defaultdict(lambda: defaultdict(dict))
d['a']['b']['c'] = 'd'
Другие вопросы по тегам