2011-12-18 12 views
14

Z innej funkcji mam takie krotki, jak ('falseName', 'realName', positionOfMistake), np. ('Milter', 'Miller', 4). muszę napisać funkcję, które sprawiają, że słownik tak:Słownik python słowników

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

Funkcja musi wziąć słownik i krotki jak wyżej, jako argumenty.

myślałem coś takiego na początek:

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

Ale to nie działa i jestem rodzaj stucked tutaj.

+0

ty jesteś wcięcie jest źle. i co dokładnie nie działa? – yurib

+2

"Tup" w parametrze jest odrzucany przez linię "tup = previ ..". Kod wygląda na to, że nie trzymasz dużego obrazu w swojej głowie. Uważam, przestań, odsuń się od komputera, weź głęboki oddech, idź na spacer, usiądź, zamknij oczy i napisz kod ołówkiem i papierem. – matiu

Odpowiedz

15

Jeśli to tylko, aby dodać nową krotki i jesteś pewien, że nie ma kolizji w wewnętrznym słowniku można to zrobić:

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

Test has_key jest lepiej napisany 'if tup [0] not in d:' –

+0

w porządku - czy to dla perfomance? – aweis

+1

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

10

Korzystanie collections.defaultdict jest duża oszczędność czasu, gdy jesteś dyktuje budynek i nie wiesz wcześniej, które klucze masz zamiar mieć.

Tutaj jest używany dwukrotnie: dla wynikowego dyktando i dla każdej wartości w dyktafonie.

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 

Łącząc to z kodem:

dictionary = aggregate_names(previousFunction(string)) 

lub badań: setDefault

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

Dictionary jest dobrym sposobem, aby zaktualizować istniejący wpis dict jeśli jest tam, lub utworzyć nowy, jeśli nie wszystko w jednym:

Sposób zapętlenia:

# 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 

słowniku teraz wynosi:

{'Milter': {'Malter': 2, 'Miler': 4, 'Miller': 4}} 
Powiązane problemy