Diccionario de diccionarios en Python?

De otra función, tengo tuplas como esta ('falseName', 'realName', positionOfMistake) , por ejemplo. ('Milter', 'Miller', 4) . Necesito escribir una función que haga un diccionario como este:

 D={realName:{falseName:[positionOfMistake], falseName:[positionOfMistake]...}, realName:{falseName:[positionOfMistake]...}...} 

La función tiene que tomar un diccionario y una tupla como arriba, como argumentos.

Estaba pensando algo como esto para empezar:

 def addToNameDictionary(d, tup): dictionary={} tup=previousFunction(string) for element in tup: if not dictionary.has_key(element[1]): dictionary.append(element[1]) elif: if ... 

Pero no está funcionando y estoy un poco atascado aquí.

Si solo es para agregar una tupla nueva y está seguro de que no hay colisiones en el diccionario interno, puede hacer esto:

 def addNameToDictionary(d, tup): if tup[0] not in d: d[tup[0]] = {} d[tup[0]][tup[1]] = [tup[2]] 

El uso de collections.defaultdict es un gran ahorro de tiempo cuando construyes dicts y no sabes de antemano qué claves vas a tener.

Aquí se usa dos veces: para el dictado resultante, y para cada uno de los valores en el dict.

 import collections def aggregate_names(errors): result = collections.defaultdict(lambda: collections.defaultdict(list)) for real_name, false_name, location in errors: result[real_name][false_name].append(location) return result 

Combinando esto con tu código:

 dictionary = aggregate_names(previousFunction(string)) 

O para probar:

 EXAMPLES = [ ('Fred', 'Frad', 123), ('Jim', 'Jam', 100), ('Fred', 'Frod', 200), ('Fred', 'Frad', 300)] print aggregate_names(EXAMPLES) 

setdefault del diccionario es una buena manera de actualizar una entrada de dictado existente si está allí, o crear una nueva si no está todo de una vez:

Estilo de bucle:

 # This is our sample data data = [("Milter", "Miller", 4), ("Milter", "Miler", 4), ("Milter", "Malter", 2)] # dictionary we want for the result dictionary = {} # loop that makes it work for realName, falseName, position in data: dictionary.setdefault(realName, {})[falseName] = position 

diccionario ahora es igual a:

 {'Milter': {'Malter': 2, 'Miler': 4, 'Miller': 4}}