2011-12-18 4 views
14

Из другой функции у меня есть кортежи, подобные этому ('falseName', 'realName', positionOfMistake), например. ('Milter', 'Miller', 4). Мне нужно написать функцию, которая сделает словарь как это:python словарь словарей

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

Функция должна взять словарь и кортеж, как выше, в качестве аргументов.

Я думал, что-то вроде этого для начала:

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

Но это не работает, и я вроде stucked здесь.

+0

вы будете отступы неправильно. и что именно не работает? – yurib

+2

«tup» в параметре сдувается линией «tup = previ ..». Код выглядит так, будто у вас нет большой картины в голове. Я думаю, остановись, отойти от компьютера, глубоко вздохнуть, пойти на прогулку, сесть, закрыть глаза и написать код с помощью карандаша и бумаги. – matiu

ответ

15

Если только добавить новый кортеж, и вы уверены, что нет никаких столкновений во внутреннем словаре вы можете сделать это:

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

Тест has_key лучше написан 'if tup [0] не в d:' –

+0

okay - это для исполнения? – aweis

+1

http://stackoverflow.com/questions/1323410/has-key-or-in –

10

Использование collections.defaultdict является большой экономии времени, когда вы строить dicts и не знать заранее, какие ключи у вас будут.

Здесь он используется дважды: для результата dict и для каждого из значений в 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)) 

Или тест: SetDefault

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

словаря является хорошим способом, чтобы обновить существующую запись Dict, если она есть, или создать новый, если это не все за один раз:

Тип петли:

# 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 

словарь в настоящее время составляет:

{'Milter': {'Malter': 2, 'Miler': 4, 'Miller': 4}} 
Смежные вопросы