Но для этого мне пришлось бы использовать дополнительное пространство для объявления другого словаря.
Поскольку словарь по существу является справочной таблицей, существует конкретный способ, который он выкладывается в памяти; ключи распределяются эффективно и просто указывают на ценности, которые сами по себе не имеют особого значения. Таким образом, если вы хотите изменить отображение, вы не можете использовать существующую структуру; вместо этого вам придется создавать новые словарные записи с нуля. Понимание словаря, которое вы использовали в своем вопросе, - это хороший и понятный способ сделать это.
Что вы могли сделать, однако, повторное использование словаря у вас уже есть, и добавить новые ключи там (при удалении старых):
for k in a:
a[a[k]] = k
del a[k]
Это изменяет тот же словарь, так что выиграл» t имеют (вероятно, мало) накладные расходы нового словаря. Обратите внимание, что это предполагает, что все значения уникальны, поэтому отображение может быть полностью изменено и что набор ключей и значений не имеет общих значений. В противном случае вы столкнетесь с измененными исключениями словаря или отсутствующими значениями. Вы можете избежать прежнего, создав копию словаря ключей (хотя это означает, что у вас есть список для хранения сейчас тоже):
for k in list(a):
if a[k] != k:
a[a[k]] = k
del a[k]
Заключительного примечания: Вполне возможно, что изменение словаря несколько раз, как, который может хотя некоторые модификации побочных эффектов (для увеличения размера хэш-таблицы и т. д.), но это возможная деталь реализации CPython (и я не слишком уверен в этом).
Что делать, если два значения повторяются или у вас есть значение, которое не является хешируемой? –
@PadraicCunningham Ну, если два (или более) клавиши имеют одинаковое значение, то переписывание будет единственным способом. Я полагаю ! –
@PadraicCunningham Я не думал о сценарии с беспорядочной ценностью! Любое предложение помогло бы –