it-swarm-pt.tech

python: dicionário para string, formato personalizado?

atualmente estou exibindo somente as chaves, cada uma em uma nova linha:

'<br/>'.join(mydict)

como eu os exibo como key :: value , cada um na nova linha?

25
migajek

Percorra o iterador dict.items() que gerará um valor de chave Tuple:

'<br/>'.join(['%s:: %s' % (key, value) for (key, value) in d.items()])
74
Filip Dupanović

Isso, ou uma solução ainda mais legal usando join para unir os dois itens e os pares (key, value), evitando a interpolação % agora obsoleta, usando apenas uma única variável fictícia _ e eliminando a compreensão da lista redundante:

"<br/>".join(":: ".join(_) for _ in mydict.items())

Esteja ciente de que dicts não têm ordem, então sem sorted() você pode não conseguir o que quer:

>>> mydict = dict(a="A", b="B", c="C")
>>> ", ".join("=".join(_) for _ in mydict.items())
'a=A, c=C, b=B'

Isso também funciona apenas quando todas as chaves e valores são strings, caso contrário, join irá reclamar. Uma solução mais robusta seria:

", ".join("=".join((str(k),str(v))) for k,v in mydict.items())

Agora funciona muito bem, mesmo para chaves e valores de tipos mistos:

>>> mydict = {'1':1, 2:'2', 3:3}
>>> ", ".join("=".join((str(k),str(v))) for k,v in mydict.items())
'2=2, 3=3, 1=1'

Naturalmente, para tipos mistos, um sorted() simples não funcionará como esperado. Use-o somente se você souber que todas as chaves são strings (ou todas numéricas, etc). No primeiro caso, você pode soltar o primeiro str() também:

>>> mydict = dict(a=1, b=2, c=2)
>>> ", ".join("=".join((k,str(v))) for k,v in sorted(mydict.items()))
'a=1, b=2, c=3'
4
MestreLion

Em python 3.6 eu prefiro esta sintaxe, o que torna o código ainda mais legível:

'<br/>'.join([f'{key}: {value}' for key, value in d.items()])

Ver PEP 498 - Interpolação Literal de Cordas

3
firepol

Gostei do que Filip Dupanović fez acima. Eu modifiquei isto para ser python3-ish usando o método str.format.

'<br/>'.join(['{0}:: {1}'.format(key, value) for (key, value) in d.items()])

Eu modifiquei o acima para gerar uma string que eu poderia alimentar para uma instrução de criação de tabela SQL.

fieldpairs = ','.join(['{0} {1}'.format(key, value) for (key, value) in HiveTypes.items()])
1
user2941502