Как переключаться между ключами и значениями в словаре Python на месте (без изменения его расположения в памяти) - PullRequest
0 голосов
/ 25 марта 2019

меня попросили написать код, включающий функцию - reverse_dict_in_place (d)

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

однако, тестирование с помощью функции id () показывает, что все мои решения меняют местоположение в словарях.

def reverse_dict_in_place(d):
    d={y:x for x,y in d.items()}
    return d

Ответы [ 4 ]

0 голосов
/ 25 марта 2019

Распространяясь на предложение Гад , вы могли бы использовать диктовку:

reversed = {v: k for k, v in d.items()}

Где d - дикт, и применяются те же предположения:

  • Нет повторяющихся значений
  • Нет неопределяемых значений
  • Нет значений, которые также являются ключами

Это не будет работать без изменений для вложенных диктов.

0 голосов
/ 25 марта 2019

Некоторые предположения, чтобы это работало (спасибо всем пользователям, указавшим на это):

  • Нет повторяющихся значений
  • Нет не хэш-значенийзначения
  • Нет значений, которые также являются ключами

Если вас устраивает такое предположение, тогда я думаю, что это должно работать:

def reverse_dict_in_place(d):
    for k,v in d.items():
        del d[k]
        d[v] = k
    return d
0 голосов
/ 25 марта 2019

Примечание: @NightShade опубликовал ответ, аналогичный моему нижеследующему ответу, раньше, чем я написал.


Вы можете попробовать это:

def reverse_dict_in_place(d):
    d_copy = d.copy()
    d.clear()
    for k in d_copy:
        d[d_copy[k]] = k

Это будет работать, даже если одно из значений словаря также является ключом (как проверено ниже)

Тестирование:

my_dict = {1:1, 2:'two', 3:'three'}
reverse_dict_in_place(my_dict)
print (my_dict)

Выход:

{1: 1, «два»: 2, «три»: 3}

0 голосов
/ 25 марта 2019

Альтернатива текущим, которая позволяет значениям быть такими же, как ключи. Работает в основном одинаково, однако, опять же, никакие два значения не могут быть одинаковыми.

def reverse_dict_in_place(d):
    copy = d.copy().items()
    d.clear()
    for k, v in copy:
        d[v] = k
    return d

>>> x = {0: 1, 1: 2}
>>> y = reverse_dict_in_place(x)
>>> id(x) == id(y)
True
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...