2011-12-18 26 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

それが唯一の新しいタプルを追加することで、あなたがこれを行うことができ、内部辞書には衝突がないことが確実な場合:あなたがいるときcollections.defaultdictを使用して

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

は大きな時間の節約ですあなたはどのキーを持っているかを事前に知っていません。

ここでは、結果のdictとdictの各値に対して2回使用されます。

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はそれがあります場合は、既存の辞書エントリを更新、または作成するための良い方法です新しいものが1つではない場合:

ルーピングスタイル:

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