Existe uma maneira no Python 2.7+ para criar algo como o seguinte?
{ something_if_true if condition else something_if_false for key, value in dict_.items() }
Eu sei que você pode fazer qualquer coisa com apenas 'se':
{ something_if_true for key, value in dict_.items() if condition}
python
dictionary
dictionary-comprehension
diegueus9
fonte
fonte
dict
é feito dekey:value
elementos, você não está construindo umdict
aqui, mas umset
(veja o conjunto de literais ).Respostas:
Você já entendeu:
A if test else B
é uma expressão Python válida. O único problema com sua compreensão de ditado, como mostrado, é que o local para uma expressão em uma compreensão de ditado deve ter duas expressões, separadas por dois pontos:A
if
cláusula final atua como um filtro, diferente de ter a expressão condicional.fonte
{(a if condition else b): value for key, value in dict.items()}
vai funcionar.A resposta de @ Marcin cobre tudo, mas, caso alguém queira ver um exemplo real, adiciono dois abaixo:
Digamos que você tenha o seguinte dicionário de conjuntos
e você deseja criar um novo dicionário cujas chaves indiquem se a sequência
'a'
está contida nos valores ou não, você pode usarque produz
Agora vamos supor que você tenha dois dicionários como este
e você deseja substituir as chaves
d1
pelas chaves,d2
se os respectivos valores forem idênticos, você poderáque dá
fonte
d1
,d2
eu receboAttributeError: 'dict_values' object has no attribute 'index'
Caso você tenha condições diferentes para avaliar chaves e valores, a resposta de @ Marcin é o caminho a seguir.
Se você tiver a mesma condição para chaves e valores, é melhor criar túneis (chave, valor) em uma expressão de gerador alimentando
dict()
:É mais fácil ler e a condição é avaliada apenas uma vez por chave, valor.
Exemplo com o empréstimo do dicionário de conjuntos do @ Cleb:
Suponha que você deseje o sufixo apenas
keys
coma
no seuvalue
e que você queiravalue
substituir o comprimento do conjunto nesse caso. Caso contrário, o par de valores-chave deve permanecer inalterado.fonte
Outro exemplo no uso de if / else na compreensão do dicionário
Estou trabalhando no aplicativo de desktop de entrada de dados para o meu próprio trabalho de escritório, e é comum que esse aplicativo de entrada de dados obtenha todas as entradas do widget de entrada e as despeje em um dicionário para processamento adicional, como validação ou edição, que devemos retornar dados selecionados do arquivo de volta aos widgets de entrada etc.
A primeira rodada usando codificação tradicional (8 linhas):
Na segunda rodada, tentei usar a compreensão do dicionário, mas o loop ainda está lá (6 linhas):
Por fim, com uma declaração de compreensão de dicionário de uma linha (1 linha):
Eu uso python 3.8.3
fonte