Найти - Пользователи
Полная версия: как удалить запись в словаре со сдвигом на еденицу
Начало » Python для новичков » как удалить запись в словаре со сдвигом на еденицу
1
buddha
Есть словарик, я хочу удалить из него запись так, чтобы записи, идущие за удалённой записью, сдвигались на одно место(или хотя бы переписывались)?
Пример:
>>>d={1: 'ыыыыффф', 2: 'йййцццц', 3: 'ввввааа', 4: 'ммммииии', 5: 'дддщщщщ'}
>>>choice=input('какую запись удалить?')
>>>d.pop(choice)
>>>d
{1: 'ыыыыффф', 3: 'ввввааа', 4: 'ммммииии', 5: 'дддщщщщ'}

Вот очень хочу поменять сам ключ чтобы выглядело так:
>>>d
{1: 'ыыыыффф', 2: 'ввввааа', 3: 'ммммииии', 4: 'дддщщщщ'}
fata1ex
Записи, идущие за удалённой? Вам надо подучить основные типы данных. Скорее всего вы неправильно решаете поставленную задачу.

Словарь он тем и хорош, что доступ к элементам выполняется за O(1). А вы хотите сделать удаление O(n). Это бессмысленно, да и вообще, словарь неупорядоченная структура, непонятно, зачем упорядоченность ключей, для этого есть списки. Опишите вашу проблему.

Хотя, конечно, можно написать извращение вроде этого, но я бы подобный код никому не показывал:
>>> def foo(d, key):
...     return { k if k < key else k - 1: v for k, v in d.items() if k != key }
>>> d
{1: 'A', 2: 'B', 3: ' C', 4: 'D'}
>>> print foo(d, 2)
{1: 'A', 2: ' C', 3: 'D'}
asilyator
buddha, ты не понимаешь, как работает словарь ака хеш-массив.

Ключом в нем, в отличии от обычного массива (списка) является не сам индекс, а его хеш. Хеш функция должна быть как можно более случайной, чтобы не было коллизий. Подробности в wiki://хеш-массив.
Так вот, ключи в d.keys(), идут в порядке хеш-функции от ключей, т.е. в случайном порядке.
Если тебе нужны ключи в определенном порядке - юзай sorted(d.keys())
Imposeren
Ну если в качестве ключей использовать цифры, то почему бы просто не взять список?
>>> d = ['ыыыыффф', 'йййцццц', 'ввввааа', 'ммммииии', 'дддщщщщ']
>>> for (index, value) in enumerate(d) :
...     print(index+1, value)
...
1 ыыыыффф
2 йййцццц
3 ввввааа
4 ммммииии
5 дддщщщщ
>>> d.pop(2)
'\xd0\xb2\xd0\xb2\xd0\xb2\xd0\xb2\xd0\xb0\xd0\xb0\xd0\xb0'
>>> for (index, value) in enumerate(d) :
...     print(index+1, value)
... 
1 ыыыыффф
2 йййцццц
3 ммммииии
4 дддщщщщ
buddha
to Imposeren, я делаю через shelve сохранение/открытие данных, а этот модуль преобразует сохранённое в словарь, отсюда и ответ, почему я взял именно словарь)

всем спасибо немного изменил логику скрипта.
py.user.next
>>> d = {10: None, 3: 'c', 2: 'b', 1: 'a'}
>>> d
{1: 'a', 10: None, 3: 'c', 2: 'b'}
>>>
проделай у себя, убедись, что словарь не имеет порядка
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB