2011-12-18 5 views
14

다른 함수에서이 튜플은 ('falseName', 'realName', positionOfMistake)입니다. ('Milter', 'Miller', 4). 나는 사전과 같이 할 함수를 작성해야합니다사전의 파이썬 사전

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 테스트는'tup [0]이 d :' –

+0

에 없으면 성능이 좋습니다. – aweis

+1

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

10

collections.defaultdict를 사용하는 것은 큰 시간 절약을 당신이있을 때 사전을 작성하고 어떤 키가 있는지 미리 알지 못합니다.

여기서 두 번 사용됩니다. 결과로 작성되는 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)) 

또는 시험 :

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

사전의을 setDefault이가 있다면 기존의 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}}