Como posso imprimir um dicionário com profundidade de ~ 4 em Python? Tentei bastante imprimir pprint()
, mas não funcionou:
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(mydict)
Eu simplesmente quero um indentation ( "\t"
) para cada aninhamento, para obter algo assim:
key1
value1
value2
key2
value1
value2
etc.
Como posso fazer isso?
python
dictionary
Martineau
fonte
fonte
Respostas:
Não sei exatamente como você deseja que a formatação seja exibida, mas você pode começar com uma função como esta:
fonte
__future__
que a resposta agora menciona, então você deve empregá-los sempre que necessário (ou atualizar para o 3 já).python def pretty(d, indent=0): for key, value in d.items(): if isinstance(value, dict): print(' ' * indent + str(key)) pretty(value, indent+1) else: print(' ' * (indent+1) + f"{key}: {value}")
Meu primeiro pensamento foi que o serializador JSON provavelmente é muito bom em dicionários aninhados, então eu trapaceava e usava isso:
fonte
Você pode tentar o YAML via PyYAML . Sua saída pode ser ajustada. Eu sugiro começar com o seguinte:
print yaml.dump(data, allow_unicode=True, default_flow_style=False)
O resultado é muito legível; também pode ser analisado de volta para Python, se necessário.
Editar:
Exemplo:
fonte
float
e umnumpy.float64
Pelo que foi feito, não vejo nenhuma impressora bonita que imite pelo menos a saída do interpretador python com formatação muito simples, então aqui está a minha:
Para inicializá-lo:
Ele pode suportar a adição de formatadores para tipos definidos, basta criar uma função para essa como esta e vinculá-la ao tipo que você deseja com set_formater:
Por razões históricas, mantenho a impressora bonita anterior, que era uma função em vez de uma classe, mas ambas podem ser usadas da mesma maneira, a versão da classe simplesmente permite muito mais:
Para usá-lo :
Comparado com outras versões:
fonte
Dessa forma, você pode imprimi-lo de maneira bonita, por exemplo, o nome do seu dicionário é yasin
fonte
Outra opção com
yapf
:Resultado:
fonte
Como outras pessoas postaram, você pode usar recursion / dfs para imprimir os dados do dicionário aninhado e chamar recursivamente se for um dicionário; caso contrário, imprima os dados.
fonte
Uma das maneiras mais pitônicas para isso é usar o módulo pprint já construído .
O argumento necessário para definir a profundidade da impressão é o que você pode esperar
depth
É isso aí !
fonte
pout pode imprimir qualquer coisa que você jogue nele, por exemplo (tomando emprestado
data
de outra resposta):resultaria na saída impressa na tela como:
ou você pode retornar a saída da string formatada do seu objeto:
Seu caso de uso principal é para depuração, para que não ocorra instâncias de objetos ou qualquer coisa e lida com a saída unicode como seria de esperar, funciona no python 2.7 e 3.
divulgação : sou o autor e mantenedor do faneca.
fonte
Peguei a resposta do sth e a modifiquei um pouco para atender às minhas necessidades de dicionários e listas aninhados:
O que me dá uma saída como:
fonte
Sth, eu afundo isso é bonito;)
fonte
list
valores que não sãodict
instâncias, ou seja,pretty({'key': [1, 2, 3]}, indent=4)
==>AttributeError: 'int' object has no attribute 'iteritems'
. Também não gosto de teclas maiúsculas.fonte
Eu escrevi esse código simples para imprimir a estrutura geral de um objeto json em Python.
o resultado para os seguintes dados
é muito compacto e tem a seguinte aparência:
fonte
Eu também sou um novato em python, mas tenho trabalhado com dicionários aninhados nas últimas duas semanas e foi isso que eu criei.
Você deve tentar usar uma pilha. Transforme as chaves do dicionário raiz em uma lista de uma lista:
Indo na ordem inversa do último para o primeiro, procure cada chave no dicionário para ver se seu valor é (também) um dicionário. Caso contrário, imprima a chave e exclua-a. No entanto, se o valor da chave for um dicionário, imprima a chave e, em seguida, acrescente as chaves desse valor ao final da pilha e comece a processar essa lista da mesma maneira, repetindo recursivamente para cada nova lista de chaves.
Se o valor da segunda chave em cada lista fosse um dicionário, você teria algo assim depois de várias rodadas:
A vantagem dessa abordagem é que o recuo é apenas
\t
o dobro do comprimento da pilha:A desvantagem é que, para verificar cada chave, você precisa fazer o hash no sub-dicionário relevante, embora isso possa ser tratado facilmente com uma compreensão de lista e um
for
loop simples :Esteja ciente de que essa abordagem exigirá que você limpe as listas vazias à direita e exclua a última chave em qualquer lista seguida por uma lista vazia (que, é claro, pode criar outra lista vazia e assim por diante).
Existem outras maneiras de implementar essa abordagem, mas espero que isso lhe dê uma idéia básica de como fazê-lo.
EDIT: Se você não quiser passar por tudo isso, o
pprint
módulo imprime dicionários aninhados em um bom formato.fonte
Aqui está uma função que escrevi com base no comentário do sth. Funciona da mesma forma que json.dumps com recuo, mas estou usando guias em vez de espaço para recuos. No Python 3.2+, você pode especificar que o recuo seja um '\ t' diretamente, mas não no 2.7.
Ex:
fonte
Aqui está algo que imprimirá qualquer tipo de dicionário aninhado, mantendo o controle dos dicionários "pais" ao longo do caminho.
Esse é um bom ponto de partida para imprimir de acordo com diferentes formatos, como o especificado no OP. Tudo o que você realmente precisa fazer é operar nos blocos de impressão . Observe que parece ver se o valor é 'OrderedDict ()'. Dependendo de você estar usando algo das coleções de tipos de dados Container , você deve fazer esse tipo de proteção contra falhas para que o bloco elif não o veja como um dicionário adicional devido ao seu nome. A partir de agora, um exemplo de dicionário como
irá imprimir
~ alterando o código para se ajustar ao formato da pergunta ~
Usando o mesmo código de exemplo, ele imprimirá o seguinte:
Isso não é exatamente o que é solicitado no OP. A diferença é que um pai ^ n ainda é impresso, em vez de estar ausente e substituído por espaço em branco. Para chegar ao formato do OP, você precisará fazer algo como o seguinte: compare iterativamente dicList com o lastDict . Você pode fazer isso criando um novo dicionário e copiando o conteúdo da dicList para ele, verificando se i no dicionário copiado é o mesmo que i no lastDict e - se estiver - escrevendo espaço em branco nesse posição eu uso, usando a função multiplicadora de strings .
fonte
A partir deste link :
fonte
Acabei de voltar a esta pergunta depois de receber a resposta de sth e fazer uma modificação pequena, mas muito útil. Essa função imprime todas as chaves na árvore JSON , bem como o tamanho dos nós das folhas nessa árvore.
É muito bom quando você tem objetos JSON grandes e deseja descobrir onde está a carne. Exemplo :
Isso indica que a maioria dos dados importantes provavelmente está dentro,
JSON_object['key1']['key2']['value2']
porque o comprimento desse valor formatado como uma string é muito grande.fonte
Use esta função:
Chame assim:
fonte
Isto é o que eu criei enquanto trabalhava em uma classe que precisava escrever um dicionário em um arquivo .txt:
Agora, se tivermos um dicionário como este:
E nós fazemos:
Nós temos:
fonte