2013-12-18 3 views
0

У меня есть следующий код:Append() алгоритм неправильно добавляет

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

Я ожидаю, что после итерации 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

Это звучит так, как будто вы повторно используете объект списка где-то, но ваш код создает запись словаря * new * для каждого файла 'file'; вы уверены, что код, который вы разместили здесь, является полным и точным? –

+0

Crap! ... Единственное различие заключается в том, что я использую константу SPOTLIGHT = {"spotlight": []} для инициализации, а не для этого {"spotlight": []}. Я изменил его в приведенном выше коде, чтобы было легче читать ... Держу пари, это проблема. – Brad

+0

О, это * совершенно * проблема здесь. –

ответ

3

Вы используете постоянный объект словаря, с изменяемым списком Это означает, что теперь делится?. . же объект словаря (и список объектов) по вашей структуре

код, как размещены, не будет делать это, заменить вашу константу с тем, что вы вывесили здесь :-)

Если вы должны использовать. (например, вам нужна одна и та же структура в нескольких местах), вместо этого используйте заводскую функцию:

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

и используйте SPOTLIGHT() везде, где вам нужна новая копия.

+0

Спасибо. Есть ли способ, которым вы можете выполнить абстрагирование буквального {"spotlight": []} из моего кода без возникновения этой ошибки? Могу ли я клонировать его, когда я инициализирую эти или что-то еще? – Brad

+0

@Brad: Используйте заводскую функцию для его создания. 'SPOTLIGHT = lambda: {'spotlight': []}', а затем использовать 'SPOTLIGHT()' всякий раз, когда вам нужна новая копия. –

+0

PERFECT. Благодаря :) – Brad

Смежные вопросы