2010-11-08 15 views
5

Je travaille sur un script de traitement d'image. Je dois laisser l'utilisateur spécifier comment remapper certaines classes dans une image via un fichier texte. La syntaxe de ce fichier doit être simple et évidente. Ce que je pensais de faire est d'obtenir l'utilisateur d'écrire la version de chaîne d'un dictionnaire:Transformation de la représentation sous forme de chaîne d'un dictionnaire dans un vrai dictionnaire

125:126, 126:126, 127:128, 128:128 

puis le transformer en un véritable dictionnaire (ce qui est le chaînon manquant):

a = {125:126, 126:126, 127:128, 128:128} 

Le remappage des classes de l'image serait alors fait comme ceci:

u, indices = numpy.unique(image, return_inverse=True) 
for i in range(0, len(u)): 
    u[i] = a[u[i]] 
updatedimage = u[indices] 
updatedimage = numpy.resize(updatedimage, (height, width)) #Resize to original dims 

Yat-il un moyen simple de faire cette transformation de la « version chaîne » à un véritable dictionnaire? Pouvez-vous penser à une syntaxe simple/alternative plus simple que l'utilisateur pourrait utiliser?

Répondre

11

Vous pouvez utiliser ast.literal_eval:

>>> import ast 
>>> ast.literal_eval('{' + s + '}') 
{128: 128, 125: 126, 126: 126, 127: 128} 

Notez que cela nécessite Python 2.6 ou plus récent.

Une alternative est de diviser la chaîne sur ',' puis diviser chaque morceau sur ':' et construire un dict de cette:

>>> dict(map(int, x.split(':')) for x in s.split(',')) 
{128: 128, 125: 126, 126: 126, 127: 128} 

Les deux exemples supposent que votre chaîne initiale est dans une variable appelée s:

>>> s = '125:126, 126:126, 127:128, 128:128' 
+0

Merci, les deux fonctionnent très bien. Je préfère votre alternative; il va enregistrer une autre importation, et travailler avec une version plus ancienne ... – Benjamin