web-dev-qa-db-fra.com

python: dictionnaire à chaîne, format personnalisé?

actuellement, je n’affiche que les clés, chacune dans la nouvelle ligne:

'<br/>'.join(mydict)

comment puis-je les afficher comme clé :: valeur , chacun dans la nouvelle ligne?

25
migajek

Passez par l'itérateur dict.items() qui donnera une clé, valeur Tuple:

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

Cela, ou une solution encore plus cool utilisant join pour joindre les deux paires éléments et (clé), en évitant l’interpolation maintenant obsolète %, en utilisant une seule variable factice _ et en supprimant la compréhension de la liste redondante:

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

Sachez que les dictés n'ont pas de commande, donc sans sorted(), vous n'obtiendrez peut-être pas ce que vous voulez:

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

Cela ne fonctionne également que lorsque toutes les clés et valeurs sont des chaînes, sinon join se plaindra. Une solution plus robuste serait:

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

Maintenant, cela fonctionne très bien, même pour les clés et les valeurs de types mixtes:

>>> 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'

Bien sûr, pour les types mixtes, une sorted() simple ne fonctionnera pas comme prévu. Utilisez-le uniquement si vous savez que toutes les clés sont des chaînes (ou toutes numériques, etc.). Dans le premier cas, vous pouvez également supprimer la première str():

>>> 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

En python 3.6, je préfère cette syntaxe, ce qui rend le code encore plus lisible:

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

Voir PEP 498 - Interpolation de chaîne littérale

3
firepol

J'ai aimé ce que Filip Dupanović a fait ci-dessus. J'ai modifié cela pour qu'il soit python3-ish en utilisant la méthode str.format.

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

J'ai modifié ce qui précède pour générer une chaîne que je pourrais alimenter en une instruction de création de table SQL.

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