OK, então isso é mais um exercício de "otimização" de código.
Tenho que mover todos os elementos de um dicionário python para outro, sob certas condições, enquanto esvazio o dicionário de origem ao mesmo tempo. (Não importa se eu encontro elementos correspondentes ou não, o dicionário de origem deve estar vazio no final)
Vamos ter:
pie={"A1":{2000,2001,2002},"A2":{2003,2004,2005},"A3":{2000,2004,2007}} ; slices={}
condition_check=2000
Como eu disse, eu precisava mover os elementos para o dict de destino somente quando eles atendessem a uma certa condição. A correspondência é feita em chaves e/ou valores enquanto esvazia o dict de origem, e então eu comecei com este código (nesse caso a condição é em valores):
while bool(pie):
temp = pie.popitem()
if (condition_check in temp[1]): slices.update({temp[0]:temp[1]})
Agora a questão é: existe uma maneira de fazer isso sem a temp = pie.popitem()
linha? (Pensei que talvez fosse possível usar uma expressão de atribuição para colocá-la dentro da if
condição, talvez?)
PS Eu sei que poderia ir com
for s in [{k:v} for k,v in pie.items() if (condition_check in v)]: slices.update(s)
pie.clear()
ou, alternativamente
s = {k:v for k,v in pie.items() if (condition_check in v)} ; slices.update(s)
pie.clear()
Por fim, acho que slices.update({k:v for k,v in pie.items() if (condition_check in v)}) ; pie.clear()
poderia servir bem
Ainda assim, eu gostaria de otimizar o primeiro código de forma a "mover/mesclar" a temp = pie.popitem()
atribuição dentro da if
condição de alguma forma... E estou curioso para saber se é possível conseguir algo assim de qualquer maneira, para ser sincero.
EDITAR:
Como @KellyBundy observou nos comentários: de fato, a coisa a realmente garantir aqui era que o dicionário de origem tinha que estar vazio no final antes de prosseguir. Dentro do loop while, isso é feito passo a passo, usando popitem()
. Mas também uma clear()
instrução as muito primeira imediatamente após a compreensão for é boa para isso
Para um código limpo , você só quer algo como:
Isso, é claro, pressupõe que
slices
já esteja definido, se você fosse apenas defini-lo:Você poderia usar uma expressão de atribuição na sua construção original, mas isso não otimiza tanto quanto obfuscate . Pare de tentar colocar tudo em uma linha, siga as diretrizes de estilo PEP 8 e use recuo após condições, etc. Mas só para mostrar como:
Observe também que não há necessidade de
while bool(pie): ...
porquebool()
será chamado implicitamente em contextos booleanos, como a condição de um loop while.Mas o código acima é feio e não é python. O seguinte é muito mais legível e limpo:
Mais linhas são boas . Elas ajudam a tornar seu código mais legível. Mas, novamente, eu usaria apenas uma das duas primeiras em vez deste loop while.