2010-11-08 10 views
5

Estoy trabajando en un script de procesamiento de imágenes. Debo dejar que el usuario especifique cómo reasignar algunas clases en una imagen a través de un archivo de texto. La sintaxis en este archivo debe ser simple y evidente. Lo que se me ocurrió hacer es conseguir que el usuario escriba la versión de cadena de un diccionario:Transformando la representación de cadenas de un diccionario en un diccionario real

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

y luego transformarlo en un diccionario real (esto es el eslabón perdido):

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

El reasignación de las clases de la imagen sería entonces hacerse así:

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 

¿hay una manera simple de hacer esta transformación de la versión "cadena" a un diccionario real? ¿Puedes pensar en una sintaxis de una línea más fácil/alternativa que el usuario pueda usar?

Respuesta

11

Puede utilizar ast.literal_eval:

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

Tenga en cuenta que esto requiere Python 2.6 o posterior.

Una alternativa es dividir la cadena en ',' y luego dividir cada pieza en ':' y construir un dict de que:

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

Ambos ejemplos asumen que la cadena inicial está en una variable llamada s:

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

Gracias, ambos funcionan muy bien. Prefiero tu alternativa; salvará otra importación y trabajará con una versión anterior ... – Benjamin

Cuestiones relacionadas