#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 для несуществующих ключей.