Eu tenho um dict
que tem um monte de entradas. Estou interessado apenas em alguns deles selecionados. Existe uma maneira fácil de remover todos os outros?
python
dictionary
mpen
fonte
fonte
Respostas:
Construindo um novo ditado:
Usa compreensão de dicionário.
Se você usa uma versão que não possui (por exemplo, Python 2.6 e anterior), faça-o
dict((your_key, old_dict[your_key]) for ...)
. É o mesmo, embora mais feio.Observe que isso, diferente da versão do jnnnnn, tem desempenho estável (depende apenas do número de suas_chaves) para
old_dict
s de qualquer tamanho. Tanto em termos de velocidade e memória. Como essa é uma expressão geradora, ele processa um item de cada vez e não analisa todos os itens do old_dict.Removendo tudo no local:
fonte
old_dict
indica um erro em outro lugar e, nesse caso, eu prefiro um erro a resultados silenciosamente errados.Compreensão de ditado um pouco mais elegante:
fonte
mydict.iteritems()
..items()
cria outra lista.Aqui está um exemplo no python 2.6:
A parte de filtragem é a
if
declaração.Esse método é mais lento que a resposta de delnan, se você deseja selecionar apenas algumas das muitas teclas.
fonte
if key in ('x','y','z')
eu acho.Você pode fazer isso com a função de projeto da minha biblioteca de funções :
Veja também select_keys .
fonte
Código 1:
Código 2:
Código 3:
Todo o desempenho do código é medido com timeit usando número = 1000 e coletado 1000 vezes para cada código.
Para o python 3.6, o desempenho de três formas de chaves de filtro é quase o mesmo. Para o python 2.7, o código 3 é um pouco mais rápido.
fonte
Este lambda de um liner deve funcionar:
Aqui está um exemplo:
É uma compreensão básica da lista que itera sobre as chaves de ditado (i em x) e gera uma lista de pares de tupla (chave, valor) se a chave estiver na lista de chaves desejada (y). Um dict () envolve a coisa toda para produzir como um objeto dict.
fonte
set
parawanted_keys
, mas parece bom.dictfilt({'x':['wefwef',52],'y':['iuefiuef','efefij'],'z':['oiejf','iejf']}, ('x','z'))
:, ele retornará{'x': ['wefwef', 52], 'z': ['oiejf', 'iejf']}
como pretendido.dict={'0':[1,3], '1':[0,2,4], '2':[1,4]}
e o resultado foi{}
, que eu assumi ser um ditado em branco.foo = {'0':[1,3], '1':[0,2,4], '2':[1,4]}; dictfilt(foo,('0','2'))
, eu recebo:{'0': [1, 3], '2': [1, 4]}
que é o resultado pretendidoDado o seu dicionário original
orig
e o conjunto de entradas em que você está interessadokeys
:o que não é tão bom quanto a resposta de delnan, mas deve funcionar em todas as versões de interesse do Python. É, no entanto, frágil para cada elemento
keys
existente no seu dicionário original.fonte
Com base na resposta aceita por delnan.
E se uma de suas chaves desejadas não estiver no old_dict? A solução delnan lançará uma exceção KeyError que você pode capturar. Se não é isso que você precisa, talvez você queira:
inclua apenas chaves que existam tanto no ditado antigo quanto no seu conjunto de chaves desejadas.
tem um valor padrão para chaves que não está definido no old_dict.
fonte
{k: old_dict.get(k, default) for k in ...}
Esta função fará o truque:
Assim como a versão de delnan, esta usa compreensão de dicionário e tem desempenho estável para dicionários grandes (depende apenas do número de chaves que você permite, e não do número total de chaves no dicionário).
E, assim como a versão do MyGGan, esta permite que sua lista de chaves inclua chaves que podem não existir no dicionário.
E como bônus, aqui está o inverso, onde você pode criar um dicionário excluindo determinadas chaves no original:
Observe que, diferentemente da versão do delnan, a operação não é realizada no local, portanto o desempenho está relacionado ao número de chaves no dicionário. No entanto, a vantagem disso é que a função não modifica o dicionário fornecido.
Editar: adicionada uma função separada para excluir determinadas teclas de um ditado.
fonte
keys
por qualquer tipo de iterável, como o que o conjunto aceita.invert
implica que okeys
argumento seja mantido ou que okeys
argumento seja rejeitado?", Quantas delas concordariam?Se queremos criar um novo dicionário com as chaves selecionadas removidas, podemos fazer uso da compreensão do dicionário.
Por exemplo:
fonte
Outra opção:
Mas você obtém um
list
(Python 2) ou um iterador (Python 3) retornado porfilter()
, não umdict
.fonte
filtered
emdict
e você recebe de volta o dicionário!Forma curta:
Como a maioria das respostas sugere, a fim de manter a concisão, precisamos criar um objeto duplicado, seja ele
list
oudict
. Este cria um descarte,list
mas exclui as chaves no originaldict
.fonte
Aqui está outro método simples usando
del
em um forro:e_keys
é a lista das chaves a serem excluídas. Ele atualizará seu ditado em vez de fornecer um novo.Se você deseja um novo dict de saída, faça uma cópia do dict antes de excluir:
fonte
Você poderia usar
python-benedict
, é uma subclasse dict.Instalação:
pip install python-benedict
É de código aberto no GitHub: https://github.com/fabiocaccamo/python-benedict
Isenção de responsabilidade: sou o autor desta biblioteca.
fonte