Есть ли способ переименовать ключ словаря, не переназначая его значение на новое имя и удаляя старый ключ имени; и без перебора по ключу / значению dict?
В случае OrderedDict, сделайте то же самое, сохраняя позицию этого ключа.
python
dictionary
associative-array
ordereddictionary
Рабин Утам
источник
источник
OrderedDict
. диктанты игнорируют порядок, когда их сравнивают на равенство, тогда какOrderedDict
принимают во внимание порядок при сравнении. Я знаю, что вы ссылались на что-то, что объясняет это, но я подумал, что ваш комментарий мог ввести в заблуждение тех, кто, возможно, не читал эту ссылку.OrderedDict
при сравнении учитывает порядок" Хорошо, но никому нет дела после 3.7. Я утверждаю,OrderedDict
что в значительной степени устарел, можете ли вы сформулировать причины, почему это не так? например, здесь не убедительно, если вам не нужноreversed()
Ответы:
Для обычного dict вы можете использовать:
Для OrderedDict, я думаю, вы должны создать совершенно новый, используя понимание.
Модификация самого ключа, как кажется, задает этот вопрос, нецелесообразна, поскольку ключи диктовки обычно являются неизменяемыми объектами, такими как числа, строки или кортежи. Вместо того, чтобы пытаться изменить ключ, переназначение значения новому ключу и удаление старого ключа - это то, как вы можете добиться «переименования» в python.
источник
dict.pop
это работает для OrderedDict на основе моего теста.OrderedDict
сохранится порядок вставки, о котором вопрос не задан.лучший метод в 1 строке:
источник
d = {('test', 'foo'):[0,1,2]}
?d[('new', 'key')] = d.pop(('test', 'foo'))
Используя проверку
newkey!=oldkey
, вы можете сделать следующее:источник
dict
порядок, даже если python3.6 + внедряет его в упорядоченную форму, предыдущие версии этого не делают, и это на самом деле не просто следствие того, как изменились вложения py3.6 +. Используйте,OrderedDict
если вы заботитесь о порядке.В случае переименования всех ключей словаря:
источник
target_dict.keys()
гарантированно быть такой же порядок , как и в определении? Я думал, что Python dict неупорядочен, а порядок с точки зрения ключей dict непредсказуемВы можете использовать это,
OrderedDict recipe
написанное Raymond Hettinger, и изменить его, чтобы добавитьrename
метод, но по сложности это будет O (N):Пример:
вывод:
источник
OrderedDict
из него. Но я бы порекомендовал: создать класс, который наследуется от него,OrderedDict
и добавитьrename
к нему метод.Несколько человек до меня упомянули
.pop
трюк, чтобы удалить и создать ключ в одну строку.Лично я нахожу более явную реализацию более читабельной:
Код выше возвращает
{'a': 1, 'c': 2}
источник
Другие ответы довольно хороши. Но в python3.6 регулярный dict также имеет порядок. Поэтому трудно удерживать положение клавиши в обычном случае.
источник
В Python 3.6 (далее?) Я бы пошел на следующую однострочную
который производит
Может быть стоит отметить, что без
print
заявления ноутбук ipython console / jupyter представляет словарь в порядке их выбора ...источник
Я придумал эту функцию, которая не изменяет оригинальный словарь. Эта функция также поддерживает список словарей.
источник
Я использую ответ @wim выше, с dict.pop () при переименовании ключей, но я нашел ошибку. Циклическое переключение между диктовкой для изменения ключей без полного отделения списка старых ключей от экземпляра dict приводило к циклическому изменению новых, измененных ключей в цикле и отсутствию некоторых существующих ключей.
Для начала я сделал это так:
Я обнаружил, что, перебирая диктовку таким образом, словарь продолжал находить ключи, даже когда он не должен был, то есть новые ключи, те, которые я изменил! Мне нужно было полностью отделить экземпляры друг от друга, чтобы (а) избежать нахождения собственных измененных ключей в цикле for и (б) найти некоторые ключи, которые по какой-то причине не были найдены в цикле.
Я делаю это сейчас:
Преобразование my_dict.keys () в список было необходимо, чтобы освободить ссылку на изменяющийся диктат. Простое использование my_dict.keys () позволило мне быть привязанным к оригинальному экземпляру со странными побочными эффектами.
источник
В случае, если кто-то хочет переименовать все ключи сразу, предоставив список с новыми именами:
источник
@ helloswift123 Мне нравится твоя функция. Вот модификация для переименования нескольких ключей за один вызов:
источник
Предположим, вы хотите переименовать ключ k3 в k4:
источник
TypeError: 'dict' object is not callable
Еслиtemp_dict('k3')
вы пытаетесь сослаться на значениеk3
ключа, вам следует использовать квадратные скобки, а не круглые скобки. Однако это просто добавит новый ключ в словарь и не будет переименовывать существующий ключ в соответствии с запросом.