2011-12-18 22 views
14

Başka bir fonksiyondan, bu ('falseName', 'realName', positionOfMistake), gibi bir dosyadan var. ('Milter', 'Miller', 4). Ben bir sözlük böyle yapmak bir işlevi yazmak gerekir:sözlüklerin python sözlükleri

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

işlev parametresi olarak bir sözlük ve üzeri gibi bir kayıt düzeni almak zorundadır.

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

Ama çalışmıyor ve Burada biraz stucked duyuyorum:

Ben bir başlangıç ​​için böyle bir şey düşünüyordum.

+0

Eğer sizsiniz, girinti yanlıştır. ve tam olarak ne işe yaramıyor? – yurib

+2

Parametrede 'tup', 'tup = previ ..' satırından atılıyor. Kod, büyük resmi kafanda tutmuyormuş gibi görünüyor. Durmayı düşünüyorum, bilgisayardan uzaklaş, derin bir nefes al, bir yürüyüşe çık, otur, gözlerini kapat ve kodu kalemle ve kağıda yaz. – matiu

cevap

15

yeni bir başlığın eklemek için yalnızca ve sen bunu yapabilirsin iç sözlükte hiçbir çarpışmalar olduğundan emin değilseniz:

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

Eş_key testi daha iyi yazılmıştır, eğer tup [0] d: ' –

+0

değil ise - performans için mi? – aweis

+1

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

10

collections.defaultdict Kullanılması olan büyük bir zaman tasarrufu siz olduğunuzda Dicts inşa etmek ve hangi tuşları kullanacağınızı önceden bilmiyorum.

Burada iki kez kullanılır: ortaya çıkan dict için ve dict içindeki her bir değer için.

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 

, kodunuzu bu birleştiren:

dictionary = aggregate_names(previousFunction(string)) 

Veya testine:

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

Sözlüğün setDefault orada mı varolan dict girişini güncelleyebilir veya oluşturmak için iyi bir yoldur hepsi bir arada değilse yeni bir tane:

Döngü stili:

# 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özlüğü artık eşittir:

{'Milter': {'Malter': 2, 'Miler': 4, 'Miller': 4}} 
İlgili konular