Verifiquei todas as outras perguntas com o mesmo erro e ainda não encontrei uma solução útil = /
Eu tenho um dicionário de listas:
d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}
em que alguns dos valores estão vazios. No final da criação dessas listas, desejo remover essas listas vazias antes de retornar meu dicionário. Atualmente, estou tentando fazer o seguinte:
for i in d:
if not d[i]:
d.pop(i)
no entanto, isso está me dando o erro de tempo de execução. Estou ciente de que você não pode adicionar / remover elementos em um dicionário enquanto itera através dele ... o que seria uma maneira de contornar isso então?
fonte
keys
faz uma cópia das chaves pelas quais você pode interagir', ou seja, asplural
chaves, certo? Caso contrário, como é possível iterar sobre uma única chave? Eu não estou nit escolher a propósito, estou realmente interessado em saber se isso é realmente tecla ou teclasfor i in d.keys()
realmente funciona no python 3.x em geral , mas, como é iterativo em uma exibição iterável das chaves do dicionário, a chamadad.pop()
durante o loop leva ao mesmo erro que você encontrou.for i in list(d)
emula o comportamento levemente ineficiente do python 2 de copiar as chaves para uma lista antes da iteração, em circunstâncias especiais como a sua.list(d.keys())
cria a mesma saída quelist(d)
, chamandolist
adict
retorna as chaves. Akeys
ligação (embora não seja tão cara) é desnecessária.Basta usar a compreensão do dicionário para copiar os itens relevantes para um novo ditado
Para isso em Python 3
fonte
d.iteritems()
me deu um erro. Emd.items()
vez disso, usei - usando python3Você só precisa usar "copiar":
Dessa maneira, você itera sobre os campos originais do dicionário e, em tempo real, pode alterar o ditado desejado (dict). É um trabalho em cada versão python, por isso é mais claro.
fonte
Eu tentaria evitar a inserção de listas vazias em primeiro lugar, mas geralmente usaria:
Se anterior a 2.7:
ou apenas:
fonte
Para Python 3:
fonte
Você não pode percorrer um dicionário enquanto ele estiver sendo alterado durante o loop for. Faça um casting para listar e itere sobre essa lista, funciona para mim.
fonte
Para situações como essa, eu gosto de fazer uma cópia profunda e fazer um loop através dessa cópia enquanto modifica o ditado original.
Se o campo de pesquisa estiver em uma lista, você poderá enumerar no loop for da lista e especificar a posição como índice para acessar o campo no ditado original.
fonte
Isso funcionou para mim:
A conversão dos itens do dicionário para a lista cria uma lista de seus itens, para que você possa iterar sobre ele e evitar o
RuntimeError
.fonte
dictc = {"stName": "asas"} chaves = dictc.keys () para a chave na lista (chaves): dictc [key.upper ()] = 'Novo valor' print (str (dictc))
fonte
O motivo do erro de tempo de execução é que você não pode iterar através de uma estrutura de dados enquanto sua estrutura está sendo alterada durante a iteração.
Uma maneira de conseguir o que você está procurando é usar a lista para anexar as chaves que você deseja remover e, em seguida, usar a função pop no dicionário para remover a chave identificada enquanto percorre a lista.
fonte
O Python 3 não permite a exclusão ao iterar (usando o loop for acima). Existem várias alternativas para fazer; Uma maneira simples é mudar a seguinte linha
Com
fonte