Existe uma maneira de renomear uma chave de dicionário, sem reatribuir seu valor a um novo nome e remover a chave de nome antiga; e sem iterar através da chave / valor do dict?
No caso de OrderedDict, faça o mesmo, mantendo a posição dessa chave.
python
dictionary
associative-array
ordereddictionary
rabin utam
fonte
fonte
OrderedDict
. os decretos ignoram a ordem quando estão sendo comparados em relação à igualdade, enquantoOrderedDict
levam em consideração a ordem ao serem comparados. Sei que você vinculou a algo que explica isso, mas achei que seu comentário poderia ter enganado aqueles que talvez não tenham lido esse link.OrderedDict
leva em conta a ordem ao ser comparado" Ok, mas ninguém se importa após o 3.7. Eu afirmo queOrderedDict
é amplamente obsoleto, você pode articular razões pelas quais não é? por exemplo, aqui não é convincente, a menos que você precisareversed()
Respostas:
Para um ditado regular, você pode usar:
Para um OrderedDict, acho que você deve criar um inteiramente novo usando uma compreensão.
Modificar a chave em si, como esta pergunta parece estar se perguntando, é impraticável porque as chaves de ditado geralmente são objetos imutáveis , como números, strings ou tuplas. Em vez de tentar modificar a chave, reatribuir o valor a uma nova chave e remover a chave antiga é como você pode obter a "renomeação" em python.
fonte
dict.pop
é viável para um OrderedDict com base no meu teste.OrderedDict
preservará o pedido de inserção, que não é sobre o que a pergunta foi feita.melhor método em 1 linha:
fonte
d = {('test', 'foo'):[0,1,2]}
?d[('new', 'key')] = d.pop(('test', 'foo'))
Usando uma verificação para
newkey!=oldkey
, desta maneira, você pode fazer:fonte
dict
ordem, mesmo que o python3.6 + o inicialize na forma ordenada, as versões anteriores não o fazem e não é realmente um recurso apenas um efeito posterior de como os dicionários py3.6 + foram alterados. UseOrderedDict
se você se importa com a ordem.No caso de renomear todas as chaves do dicionário:
fonte
target_dict.keys()
garantia é da mesma ordem que na definição? Eu pensei que um ditado de Python não era ordenado, e a ordem da exibição das chaves de umVocê pode usar isso
OrderedDict recipe
escrito por Raymond Hettinger e modificá-lo para adicionar umrename
método, mas isso será um O (N) em complexidade:Exemplo:
resultado:
fonte
OrderedDict
-o. Mas eu recomendaria: Crie uma classe que herdaOrderedDict
e adicione umrename
método a ela.Algumas pessoas antes de mim mencionaram o
.pop
truque para excluir e criar uma chave em uma linha.Pessoalmente, acho a implementação mais explícita mais legível:
O código acima retorna
{'a': 1, 'c': 2}
fonte
Outras respostas são muito boas, mas no python3.6, o dict regular também tem ordem. Portanto, é difícil manter a posição da chave no caso normal.
fonte
No Python 3.6 (em diante?), Eu iria para o seguinte one-liner
que produz
Pode-se notar que, sem a
print
declaração, o notebook ipython console / jupyter apresenta o dicionário em uma ordem de sua escolha ...fonte
Eu vim com essa função que não altera o dicionário original. Esta função também suporta lista de dicionários também.
fonte
Estou usando a resposta de @wim acima, com dict.pop () ao renomear chaves, mas encontrei uma pegadinha. Percorrer o dict para alterar as chaves, sem separar completamente a lista de chaves antigas da instância dict, resultou em um ciclo novo, alterou as chaves no loop e faltou algumas chaves existentes.
Para começar, eu fiz desta maneira:
Eu descobri que, percorrendo o ditado dessa maneira, o dicionário continuava encontrando chaves, mesmo quando não deveria, ou seja, as novas chaves, as que eu havia mudado! Eu precisava separar completamente as instâncias umas das outras para (a) evitar encontrar minhas próprias chaves alteradas no loop for e (b) encontrar algumas chaves que não estavam sendo encontradas dentro do loop por algum motivo.
Estou fazendo isso agora:
A conversão de my_dict.keys () em uma lista foi necessária para se livrar da referência ao dict em mudança. Apenas o uso de my_dict.keys () me manteve ligado à instância original, com os estranhos efeitos colaterais.
fonte
Caso alguém queira renomear todas as chaves de uma só vez, forneça uma lista com os novos nomes:
fonte
@ helloswift123 Gosto da sua função. Aqui está uma modificação para renomear várias chaves em uma única chamada:
fonte
Suponha que você queira renomear a chave k3 para k4:
fonte
TypeError: 'dict' object is not callable
Setemp_dict('k3')
você estiver tentando fazer referência ao valor dak3
chave, use colchetes e não parênteses. No entanto, isso adicionará apenas uma nova chave ao dicionário e não renomeará uma chave existente, conforme solicitado.