Как в питон удалить элемент словаря, сдвинув при этом остальные элементы, следующие за удалённым элементом?
У меня возникла проблема во время написания программы на питон, при реализации функции удаления артикула в словаре образуется пустое место, т.е. в словаре появляется разрыв индексов и перебрать словарь по ключам не получается:
{'a1': 'AE1016000|',
'a2': 'AE1016001|',
'a3': 'AE1016002|',
'a4': 'AE1016003|',
'a6': 'AE1016007|',
'a7': 'AE1024000|',
'a8': 'AE1024001|'}
Как можно реализовать удаление артикула с последующим сдвигом всех элементов следующих за удалённым на один?
Я пользовался стандартной функцией pop и удалял значение по известному ключу
Ответы (2 шт):
Ваша проблема решается большим и непонятным куском кода:
def remove_and_offset(dictionary:dict, n:int):
keyID = f"a{n}"
maxID = max(dictionary,
key=lambda e: int(e[1:]))
for i in range(n, int(maxID[1:]) + 1):
key = f"a{i}"
if key in dictionary:
e = dictionary.pop(key)
dictionary[f"a{i-1}"] = e
return dictionary
И ещё: в комментариях было сказано, что здесь списком куда удобнее. Чем он вам не угодил?
def remove_and_offset(dictionary, n):
keyID = f"a{n}"
maxID = max(dictionary,
key=lambda e: int(e[1:]))
res = dictionary.pop(keyID)
for i in range(n, int(maxID[1:]) + 1):
key = f"a{i}"
if key in dictionary:
e = dictionary.pop(key)
dictionary[f"a{i-1}"] = e
return dictionary
Вот так выглядит конечный вариант функции, я отправил запрос на редактирование предыдущего ответа, но правки пока не одобрены, поэтому публикую сюда.