Eu tenho um grande objeto de dicionário que possui vários pares de valores-chave (cerca de 16), mas estou interessado apenas em três deles. Qual é a melhor maneira (mais curta / eficiente / mais elegante) de conseguir isso?
O melhor que eu sei é:
bigdict = {'a':1,'b':2,....,'z':26}
subdict = {'l':bigdict['l'], 'm':bigdict['m'], 'n':bigdict['n']}
Estou certo de que existe uma maneira mais elegante do que isso. Ideias?
fonte
bigdict
não contémk
{k: bigdict.get(k,None) for k in ('l', 'm', 'n')}
lidará com a situação em que uma chave especificada está ausente no dicionário de origem, definindo a chave no novobigdict.keys() & {'l', 'm', 'n'}
==>bigdict.viewkeys() & {'l', 'm', 'n'}
para Python2.7Um pouco mais curto, pelo menos:
fonte
dict((k,bigdict.get(k,defaultVal) for k in wanted_keys)
se você deve ter todas as chaves.fonte
Um pouco de comparação de velocidade para todos os métodos mencionados:
Como era de se esperar: a compreensão de dicionários é a melhor opção.
fonte
key
não existirbigdict
.Esta resposta usa uma compreensão do dicionário semelhante à resposta selecionada, mas não será exceto em um item ausente.
versão python 2:
versão python 3:
fonte
Talvez:
O Python 3 suporta até o seguinte:
Observe que você pode verificar a existência no dicionário da seguinte maneira:
resp. para python 3
fonte
a
não estiver embigdict
Ok, isso é algo que me incomodou algumas vezes, então obrigado Jayesh por perguntar.
As respostas acima parecem uma solução tão boa quanto qualquer outra, mas se você estiver usando isso em todo o código, faz sentido agrupar a funcionalidade IMHO. Além disso, existem dois casos de uso possíveis aqui: um em que você se importa se todas as palavras-chave estão no dicionário original. e um onde você não. Seria bom tratar os dois igualmente.
Então, pelo meu valor de dois centavos, sugiro escrever uma subclasse de dicionário, por exemplo
Agora você pode extrair um sub-dicionário com
Exemplos de uso:
Se você executar todo o código acima, deverá ver (algo como) a seguinte saída (desculpe pela formatação):
fonte
subdict(orig_dict, keys, …)
?Você também pode usar
map
(que é uma função muito útil para conhecer de qualquer maneira):sd = dict(map(lambda k: (k, l.get(k, None)), l))
Exemplo:
PS: Eu peguei emprestado o
.get(key, None)
de uma resposta anterior :)fonte
Mais uma (prefiro a resposta de Mark Longair)
fonte
solução
exemplos de uso
fonte