Использование collections.defaultdict
значительно экономит время, когда вы создаете дикты и заранее не знаете, какие ключи у вас будут.
Здесь это используется дважды: для результирующего диктата,и для каждого из значений в 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
Комбинируя это с вашим кодом:
dictionary = aggregate_names(previousFunction(string))
Или для проверки:
EXAMPLES = [
('Fred', 'Frad', 123),
('Jim', 'Jam', 100),
('Fred', 'Frod', 200),
('Fred', 'Frad', 300)]
print aggregate_names(EXAMPLES)