замена ключей из словаря внутри списка python

#python #python-3.x #list #dictionary #replace

#python #python-3.x #Список #словарь #заменить

Вопрос:

У меня есть список внутри вложенного словаря

 body = {'Ready Date': '2020-01-31T12:00:00','Shipment Line List': [{'Description': 'Test', 'Weigth': '5', 
        'Height': '4.0','Length': '2.0', 'Width': '3.0'}, {'Description': 'Test', 'Weigth': '20', 'Height': '5',
        'Length': '30', 'Width': '10']}
 

Я хочу перебрать ключи во вложенном словаре и заменить «Weigth» на правильное написание «Weight»
Я попробовал этот подход, но я не получаю ожидаемого результата

 key = {"Weigth":"Weight"}
def find_replace(dict_body, dictionary):
    # is the item in the dict?
    for item in dict_body:
        # iterate by keys
        if item in dictionary.keys():
            # look up and replace
            dict_body = dict_body.replace(item, dictionary[item])
    # return updated dict
    return dict_body

a = find_replace(body,key)
print(a)
 

Комментарии:

1. Примечание: не делайте if item in dictionary.keys(): , просто делайте if item in dictionary: ; первый менее неэффективен на Python 3, чем на Python 2, но он по-прежнему без необходимости создает ненужные dict_view объекты для каждого теста.

Ответ №1:

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

 from ast import literal_eval
body = literal_eval(str(body).replace("Weigth","Weight"))
 

Это выводит:

 {'Ready Date': '2020-01-31T12:00:00',
 'Shipment Line List': [{'Description': 'Test',
   'Height': '4.0',
   'Length': '2.0',
   'Weight': '5',
   'Width': '3.0'},
  {'Description': 'Test',
   'Height': '5',
   'Length': '30',
   'Weight': '20',
   'Width': '10'}]}
 

Ответ №2:

Я хочу перебрать ключи во вложенном словаре и заменить «Weigth» на правильное написание «Weight»

что-то вроде приведенного ниже

 body = {'Ready Date': '2020-01-31T12:00:00', 'Shipment Line List': [{'Description': 'Test', 'Weigth': '5',
                                                                     'Height': '4.0', 'Length': '2.0', 'Width': '3.0'},
                                                                    {'Description': 'Test', 'Weigth': '20',
                                                                     'Height': '5',
                                                                     'Length': '30', 'Width': '10'}]}
for entry in body['Shipment Line List']:
    entry['Weight'] = entry['Weigth']
    del entry['Weigth']
print(body)
 

вывод

 {'Ready Date': '2020-01-31T12:00:00', 'Shipment Line List': [{'Description': 'Test', 'Height': '4.0', 'Length': '2.0', 'Width': '3.0', 'Weight': '5'}, {'Description': 'Test', 'Height': '5', 'Length': '30', 'Width': '10', 'Weight': '20'}]}
 

Комментарии:

1.Вы можете скопировать и удалить в одну строку с помощью: entry['Weight'] = entry.pop('Weigth') . Конечно, это предполагает, что неверный ключ всегда есть; если нет, вы, вероятно, захотите перехватить KeyError pop will raise для несуществующих ключей.