2015-07-13 2 views
5

Я ищу способы обмена всеми парами ключ-значение данного словаря.Обмен парами ключ-значение в словаре

До сих пор я мог думать так за это:

Ex:

>>>a = { 0: 'a', 1 : 'b', 2 : 'c' } 
>>> {value : key for key,value in a.items()} 
{'a': 0, 'b': 1, 'c' : 2} 

Но для этого я должен был бы использовать дополнительное пространство для объявления другого словаря.
Я хотел бы знать методы, которые я мог бы использовать для замены пары ключ-значение более эффективной с точки зрения пространства.

+4

Что делать, если два значения повторяются или у вас есть значение, которое не является хешируемой? –

+0

@PadraicCunningham Ну, если два (или более) клавиши имеют одинаковое значение, то переписывание будет единственным способом. Я полагаю ! –

+0

@PadraicCunningham Я не думал о сценарии с беспорядочной ценностью! Любое предложение помогло бы –

ответ

3

Но для этого мне пришлось бы использовать дополнительное пространство для объявления другого словаря.

Поскольку словарь по существу является справочной таблицей, существует конкретный способ, который он выкладывается в памяти; ключи распределяются эффективно и просто указывают на ценности, которые сами по себе не имеют особого значения. Таким образом, если вы хотите изменить отображение, вы не можете использовать существующую структуру; вместо этого вам придется создавать новые словарные записи с нуля. Понимание словаря, которое вы использовали в своем вопросе, - это хороший и понятный способ сделать это.

Что вы могли сделать, однако, повторное использование словаря у вас уже есть, и добавить новые ключи там (при удалении старых):

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 (и я не слишком уверен в этом).

+1

Как написано, не будет ли это (1) давать ошибку с измененным размером словаря и (2) не работать в некоторых случаях, например. 'a = {1: 1, 2: 3, 3: 2}'? – DSM

+0

@DSM Да, это возможно, хотя это сработало для меня с примером OP. Возможно, вам придется создать копию списка ключей. Что касается (2), да, для этого примера он сломается, но я предполагаю ситуацию, похожую на пример OP, где набор ключей и набор значений различны. – poke

0

Попробуйте этот код. Он удаляет элемент в словаре перед обращением ключа и значения.

for k, v in a.items(): 
    del a[k] 
    a[v] = k 
0

Чтобы избежать перезаписи особых случаев, что указывает на то, @DSM в ответ @ тыкать, я рекомендую всегда использовать второй словарь. Производительность идентична.

b = dict() 
for k, v in a.items(): # a.iteritems() in python 2 
    b[v] = k 
    del a[k] 
a = b