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}}