Форум сайта python.su
15
Есть словарик, я хочу удалить из него запись так, чтобы записи, идущие за удалённой записью, сдвигались на одно место(или хотя бы переписывались)?
Пример:
>>>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)
Офлайн
52
Записи, идущие за удалённой? Вам надо подучить основные типы данных. Скорее всего вы неправильно решаете поставленную задачу.
Словарь он тем и хорош, что доступ к элементам выполняется за 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)
Офлайн
-2
buddha, ты не понимаешь, как работает словарь ака хеш-массив.
Ключом в нем, в отличии от обычного массива (списка) является не сам индекс, а его хеш. Хеш функция должна быть как можно более случайной, чтобы не было коллизий. Подробности в wiki://хеш-массив.
Так вот, ключи в d.keys(), идут в порядке хеш-функции от ключей, т.е. в случайном порядке.
Если тебе нужны ключи в определенном порядке - юзай sorted(d.keys())
Офлайн
1
Ну если в качестве ключей использовать цифры, то почему бы просто не взять список?
>>> 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 дддщщщщ
Офлайн
15
to Imposeren, я делаю через shelve сохранение/открытие данных, а этот модуль преобразует сохранённое в словарь, отсюда и ответ, почему я взял именно словарь)
всем спасибо немного изменил логику скрипта.
Отредактировано buddha (Май 22, 2012 20:04:57)
Офлайн
857
>>> d = {10: None, 3: 'c', 2: 'b', 1: 'a'} >>> d {1: 'a', 10: None, 3: 'c', 2: 'b'} >>>
Офлайн