2013-12-18 98 views
0

我有以下代碼:追加()算法錯誤地追加

其中
sportMappings = {"sport1" : {"file" : "sport1.json", "label" : "Sport 1"},"sport2" : {"file" : "sport2.json", "label" : "Sport 2"},"sport3" : {"file" : "sport3.json", "label" : "Sport 3"}} 
normalizedEntries = {"o.json" : {"spotlight" : []}} 

normalizedEntries = createList(normalizedEntries, map_key, sportMappings) 

def createList(normalizedEntries, key, sportMappings): 
    for range in SOURCES["ranges"]: 
     data = read_files.readJSONUrl(logger, SOURCES[key] + str(range)) 
     for entry in data["entries"]: 
      normalizedEntry = normalize(entry, "type") 
      if normalizedEntry is not None: 
       #append to a catchall dict 
       normalizedEntries["o.json"]["spotlight"].append(normalizedEntry) 
       if normalizedEntry["league"] in sportMappings: 
        if sportMappings[normalizedEntry["league"]]["file"] not in normalizedEntries: 
         normalizedEntries[sportMappings[normalizedEntry["league"]]["file"]] = {"spotlight" : []} 
        #append to the specific league to which that sport belongs...ie sport1, sport2 
        normalizedEntries[sportMappings[normalizedEntry["league"]]["file"]]["spotlight"].append(normalizedEntry) 
       else: 
        pass 

    return normalizedEntries 

的點的是獲得JSON輸入,在JSON遍歷每個對象,正常化它的格式,則所有的對象追加到o.json,然後將該條目附加到sportMappings字典中對應的運動文件。

我希望以後迭代1 normalizedEntries'的內容將是:

--o.json 
    --entryForSport2 
--sport1.json 
--sport2.json 
    --entryForSport2 
--sport3.json 

迭代2次之後normalizedEntries'的內容將是:

--o.json 
    --entryForSport2 
    --entryForSport1 
    --sport1.json 
    --entryForSport1 
    --sport2.json 
    --entryForSport2 
    --sport3.json 

等。

相反,在函數完全運行後,所有子字典都是相同的。

--o.json 
    --entryForSport2 
    --entryForSport1 
--sport1.json 
    --entryForSport2 
    --entryForSport1 
--sport2.json 
    --entryForSport2 
    --entryForSport1 
--sport3.json 
    --entryForSport2 
    --entryForSport1 

問:爲什麼項目被追加到每個迭代所有子字典,而不是每個項目進入雜物箱o.json,然後到其適當的運動subdict?筆記 - 「聚光燈是一個列表,而不是一個字典那麼追加()應該是合適的工具,是

+2

這聽起來好像您在某處重用列表對象,但您的代碼爲每個'file'鍵創建* new *字典條目;你確定你在這裏發佈的代碼是完整和準確的嗎? –

+0

垃圾!唯一的區別是我使用了一個常量SPOTLIGHT = {「spotlight」:[]}來初始化它們,而不是這個{「spotlight」:[]}。我在上面的代碼中更改了它,使其更易於閱讀......我敢打賭,這是問題所在。 – Brad

+0

哦,那是*絕對*這裏的問題。 –

回答

3

您使用的是不斷字典對象,有一個可變的列表這意味着現在你分享?如果你必須使用一個用您張貼在這裏什麼你不斷:-)

;相同的字典對象(和列表對象)在您的結構

的代碼,張貼,將無法做到這一點。常量(比如說,你需要在多個地點使用相同的結構),請改用工廠功能:

SPOTLIGHT = lambda: {'spotlight': []} 

並在任何需要新副本的地方使用SPOTLIGHT()

+0

謝謝。有沒有一種方法可以完成從我的代碼中抽取文字{「spotlight」:[]}而不會遇到此錯誤?我可以在初始化這些東西時克隆它嗎? – Brad

+0

@Brad:使用工廠功能生成它。 'SPOTLIGHT = lambda:{'spotlight':[]}',然後在需要新副本時使用'SPOTLIGHT()'。 –

+0

完美。謝謝 :) – Brad