Existe uma maneira de fazer um defaultdict também ser o padrão para o defaultdict? (isto é, padrão padrão recursivo de nível infinito?)
Eu quero ser capaz de fazer:
x = defaultdict(...stuff...)
x[0][1][0]
{}
Então, eu posso fazer x = defaultdict(defaultdict)
, mas isso é apenas um segundo nível:
x[0]
{}
x[0][0]
KeyError: 0
Existem receitas que podem fazer isso. Mas isso pode ser feito simplesmente usando os argumentos normais do defaultdict?
Observe que isso está perguntando como executar um padrão default recursivo de nível infinito, portanto, é distinto do Python: defaultdict of defaultdict? , que era como executar um comando padrão de dois níveis.
Provavelmente acabarei usando o padrão de cacho , mas quando percebi que não sabia como fazer isso, fiquei interessado.
python
recursion
defaultdict
Corley Brigman
fonte
fonte
Respostas:
Para um número arbitrário de níveis:
Claro que você também pode fazer isso com um lambda, mas acho que as lambdas são menos legíveis. De qualquer forma, ficaria assim:
fonte
lambda
não funcionará.As outras respostas aqui explicam como criar uma
defaultdict
que contém "infinitamente muitas"defaultdict
, mas elas falham em abordar o que eu acho que pode ter sido sua necessidade inicial, que era simplesmente ter um decreto-padrão de duas profundidades.Você pode estar procurando:
Os motivos pelos quais você pode preferir essa construção são:
defaultdict
algo diferente de um dicionário, por exemplo:defaultdict(lambda: defaultdict(list))
oudefaultdict(lambda: defaultdict(set))
fonte
lambda
formulário está correto - porquedefaultdict(something)
retorna um objeto parecido com um dicionário, masdefaultdict
espera uma chamada! Obrigado!dict(result)
antes da piclesHá um truque bacana para fazer isso:
Então você pode criar seu
x
comx = tree()
.fonte
Semelhante à solução do BrenBarn, mas não contém o nome da variável
tree
duas vezes, por isso funciona mesmo após alterações no dicionário de variáveis:Então você pode criar cada novo
x
comx = tree()
.Para a
def
versão, podemos usar o escopo de fechamento de função para proteger a estrutura de dados da falha em que as instâncias existentes param de funcionar se otree
nome for recuperado. Se parece com isso:fonte
Eu também proporia uma implementação mais no estilo OOP, que suporta aninhamento infinito, além de formatada corretamente
repr
.Uso:
fonte
*args
e**kwargs
que permite que ele funcione como odefaultdict
, ou seja, para criar um ditado com argumentos de palavra-chave. Isso é útil para a passagemNestedDefaultDict
parajson.load
aqui está uma função recursiva para converter um ditado padrão recursivo em um ditado normal
fonte
Baseei isso na resposta de Andrew aqui. Se você deseja carregar dados de um json ou de um dict existente no nester defaultdict, consulte este exemplo:
https://gist.github.com/nucklehead/2d29628bb49115f3c30e78c071207775
fonte