Уведомления

Группа в Telegram: @pythonsu

#1 Май 22, 2012 14:42:32

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

как удалить запись в словаре со сдвигом на еденицу

Есть словарик, я хочу удалить из него запись так, чтобы записи, идущие за удалённой записью, сдвигались на одно место(или хотя бы переписывались)?
Пример:

>>>d={1: 'ыыыыффф', 2: 'йййцццц', 3: 'ввввааа', 4: 'ммммииии', 5: 'дддщщщщ'}
>>>choice=input('какую запись удалить?')
>>>d.pop(choice)
>>>d
{1: 'ыыыыффф', 3: 'ввввааа', 4: 'ммммииии', 5: 'дддщщщщ'}

Вот очень хочу поменять сам ключ чтобы выглядело так:
>>>d
{1: 'ыыыыффф', 2: 'ввввааа', 3: 'ммммииии', 4: 'дддщщщщ'}

Отредактировано buddha (Май 22, 2012 14:44:23)

Офлайн

#2 Май 22, 2012 15:52:05

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

как удалить запись в словаре со сдвигом на еденицу

Записи, идущие за удалённой? Вам надо подучить основные типы данных. Скорее всего вы неправильно решаете поставленную задачу.

Словарь он тем и хорош, что доступ к элементам выполняется за 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'}



Отредактировано fata1ex (Май 22, 2012 16:17:25)

Офлайн

#3 Май 22, 2012 16:34:49

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

как удалить запись в словаре со сдвигом на еденицу

buddha, ты не понимаешь, как работает словарь ака хеш-массив.

Ключом в нем, в отличии от обычного массива (списка) является не сам индекс, а его хеш. Хеш функция должна быть как можно более случайной, чтобы не было коллизий. Подробности в wiki://хеш-массив.
Так вот, ключи в d.keys(), идут в порядке хеш-функции от ключей, т.е. в случайном порядке.
Если тебе нужны ключи в определенном порядке - юзай sorted(d.keys())



Офлайн

#4 Май 22, 2012 19:57:38

Imposeren
От:
Зарегистрирован: 2009-04-06
Сообщения: 46
Репутация: +  1  -
Профиль   Отправить e-mail  

как удалить запись в словаре со сдвигом на еденицу

Ну если в качестве ключей использовать цифры, то почему бы просто не взять список?

>>> 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 дддщщщщ



Офлайн

#5 Май 22, 2012 19:59:28

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

как удалить запись в словаре со сдвигом на еденицу

to Imposeren, я делаю через shelve сохранение/открытие данных, а этот модуль преобразует сохранённое в словарь, отсюда и ответ, почему я взял именно словарь)

всем спасибо немного изменил логику скрипта.

Отредактировано buddha (Май 22, 2012 20:04:57)

Офлайн

#6 Май 23, 2012 02:51:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

как удалить запись в словаре со сдвигом на еденицу

>>> d = {10: None, 3: 'c', 2: 'b', 1: 'a'}
>>> d
{1: 'a', 10: None, 3: 'c', 2: 'b'}
>>>
проделай у себя, убедись, что словарь не имеет порядка



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version