append()算法错误地追加

2024-04-19 23:29:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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中将条目附加到相应的sport文件中

我希望在迭代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

问题:为什么每次迭代都要将项附加到所有子字典中,而不是将每个项添加到catch ALL o.json中,然后再添加到相应的sport子字典中?注意-“spotlight是一个列表,而不是dict,所以append()应该是合适的工具,是吗?你知道吗


Tags: injsonlabelfileappendleaguespotlightsport2
1条回答
网友
1楼 · 发布于 2024-04-19 23:29:30

您使用的是一个具有可变列表的常量字典对象。这意味着您现在在整个结构中共享同一个dictionary对象(和list对象)。你知道吗

发布的代码不会这样做;请用您在此处发布的内容替换常量。:-)

如果必须使用常量(例如,在多个位置需要相同的结构),请改用工厂函数:

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

在任何需要新拷贝的地方使用SPOTLIGHT()。你知道吗

相关问题 更多 >