2008-10-26 9 views
2

J'ai une zone de texte dans wxPython qui prend la sortie de dictionary.items() et l'affiche à l'utilisateur lorsque des éléments sont ajoutés au dictionnaire. Cependant, les données brutes est très laid, ressemblant àFormatage dict.items() pour wxPython

[(u'BC',45) 
(u'CHM',25) 
(u'CPM',30)] 

Je sais dictionary.items() est une liste de tuples, mais je ne peux pas sembler comprendre comment faire un format agréable qui est également compatible avec la méthode SetValue() de wxPython.

J'ai essayé de parcourir la liste et les tuples. Si j'utilise une instruction print, la sortie est correcte. Mais lorsque je remplace l'instruction print par SetValue(), il semble seulement obtenir la dernière valeur de chaque tuple, plutôt que les deux éléments dans le tuple.

J'ai également essayé de créer une chaîne et de passer cette chaîne à SetValue() mais, encore une fois, je peux seulement obtenir un élément dans le tuple ou l'autre, pas les deux.

Des suggestions?


Edit: Oui, je passe les résultats des dictionary.items() à un champ de texte dans une application wxPython. Plutôt que d'avoir les résultats comme ci-dessus, je suis simplement à la recherche de quelque chose comme:

BC 45 
CHM 25 
CMP 30 

Rien de spécial, tout simplement en tirant chaque valeur de chaque tuple et faire une liste visuelle.

J'ai essayé de créer un format de chaîne et de le passer à SetValue() mais il se bloque sur les deux valeurs du tuple. Il va soit imprimer en double chaque chaîne et ajouter les entiers ensemble, soit renvoyer simplement l'entier, en fonction de la manière dont je le formate.

+0

Je ne suis pas très clair. Êtes-vous en train d'essayer d'afficher les valeurs dans le champ de texte? Et si oui, à quoi ressemblerait une belle mise en forme? – derfred

Répondre

0

Peut-être que le module pretty print vous aidera:

>>> import pprint 
>>> pprint.pformat({ "my key": "my value"}) 
"{'my key': 'my value'}" 
>>> 
0
text_for_display = '\n'.join(item + u' ' + unicode(value) for item, value in my_dictionary.items()) 
0

utilisation% mise en forme (connu en C comme sprintf), par exemple:

"%10s - %d" % dict.items()[0] 

Nombre de spécifications de conversion% dans le la chaîne de format doit correspondre à la longueur du tuple, dans le cas de dict.items(), 2. Le résultat de l'opérateur de formatage de chaîne est une chaîne, de sorte que l'utiliser comme un rgument to SetValue() n'est pas un problème. Pour traduire l'ensemble dict à une chaîne:

'\n'.join(("%10s - %d" % t) for t in dict.items()) 

Les types de conversion de format sont spécifiées dans le doc.

0

Ces données semblent beaucoup mieux affichées en tant que table/grille.

4

Il n'existe pas de méthode de dictionnaire intégrée qui renvoie le résultat souhaité. Cependant, vous pouvez atteindre votre objectif en créant une fonction d'assistance qui formatera le dictionnaire, par ex.:

def getNiceDictRepr(aDict): 
    return '\n'.join('%s %s' % t for t in aDict.iteritems()) 

Cela produira votre sortie exacte souhaitée:

>>> myDict = dict([(u'BC',45), (u'CHM',25), (u'CPM',30)]) 
>>> print getNiceDictRepr(myDict) 
BC 45 
CHM 25 
CPM 30 

Ensuite, dans votre code d'application, vous pouvez l'utiliser en le passant à SetValue:

self.textCtrl.SetValue(getNiceDictRepr(myDict)) 
0

Je compris un "meilleur" moyen de formatage de la sortie. Comme d'habitude, j'essayais de nuoter quand une méthode plus élégante ferait l'affaire.

for key, value in sorted(self.dict.items()): 
    self.current_list.WriteText(key + " " + str(self.dict[key]) + "\n") 

De cette façon, trie aussi le dictionnaire par ordre alphabétique, ce qui est une grande aide lors de l'identification des éléments qui ont déjà été sélectionnés ou utilisés.