cómo analizar una cadena en un diccionario

Estoy tratando de analizar una cadena para separar las listas dentro de la cadena. Actualmente tengo la cadena:

string = "[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']]" 

¿Hay alguna forma de analizar la cadena de modo que la clave del diccionario sea el primer elemento de la lista y el valor de la clave sea el siguiente a los elementos? Por ejemplo:

 {'q1': ('0','q1'), 'q1': ('1','q2'), 'q2': ('0','q2'), 'q2': ('1', 'q1')} 

Insted de dictionary puede tener lista:
puede usar ast.literal_eval para analizar la estructura de datos de python de la cadena

 >>> import ast >>> my_string = "[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']]" >>> k = ast.literal_eval(my_string) >>> k [['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']] >>> [[x[0],tuple(x[1:])] for x in k] [['q1', ('0', 'q1')], ['q1', ('1', 'q2')], ['q2', ('0', 'q2')], ['q2', ('1', 'q1')]] 

Puedes usar JSON pero el formato de cadena debe ser un dict y no puedes tener 2 veces la misma clave :

 import json string ='{"q": ["0", "q1"], "q1": ["1", "q2"], "q3": ["1", "q1"], "q2": ["0", "q2"]}' dict = json.loads(string) print dict Output: {'q': ['0', 'q1'], 'q1': ['1', 'q2'], 'q3': ['1', 'q1'], 'q2': ['0', 'q2']} 

Para mantener los duplicados y conformar el formato de entrada:

 import collections import json string = "[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']]" d = collections.defaultdict(list) for (k, v1, v2) in json.loads(string.replace("'",'"')): d[k].append((v1, v2)) 

Con eval (si confías en tu entrada):

 import collections string = "[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']]" d = collections.defaultdict(list) for (k, v1, v2) in eval(string): d[k].append((v1, v2)) 

Contenido de d:

 defaultdict(, { 'q1': [('0', 'q1'), ('1', 'q2')], 'q2': [('0', 'q2'), ('1', 'q1')] }) 

EDITAR: y sin biblioteca en absoluto.

 string = "[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']]" d = {} for (k, v1, v2) in eval(string): d.setdefault(k, []).append((v1, v2)) 

Aunque no puedo convertirlo en una sola línea 🙂

Podría obtener diccionarios nesteds de su cadena (un poco menos directo que las respuestas anteriores). Gracias a Alex Martelli por su respuesta a Actualizar el valor de un diccionario nested de profundidad variable

 import ast def update(d, u): for k, v in u.iteritems(): if isinstance(v, dict): r = update(d.get(k, {}), v) d[k] = r else: d[k] = u[k] return d def listToDict(l): temp = l[-1] for value in l[-2::-1]: temp = {value: temp} return temp input = "[['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']]" res = {} for l in ast.literal_eval(input): update(res ,listToDict(l)) print res 

Salida:

 {'q1': {'1': 'q2', '0': 'q1'}, 'q2': {'1': 'q1', '0': 'q2'}} 

prueba esto

 >>> import ast >>> ast.literal_eval(string) [['q1', '0', 'q1'], ['q1', '1', 'q2'], ['q2', '0', 'q2'], ['q2', '1', 'q1']] >>> list=ast.literal_eval(string) >>> d={} >>> for l in list: ... d[l[0]]=tuple(l[1:]) >>> d {'q1': ('1', 'q2'), 'q2': ('1', 'q1')} 

la clave siempre es única en dict, por eso en el resultado se muestra el par de valores de clave actualizado