Python如何基于两个平行列表及索引生成嵌套字典?排查dict.fromkeys异常
问题根因
问题出在初始化album的这行代码:album = dict.fromkeys(genres,dict())dict.fromkeys()会把你传入的第二个参数直接作为引用赋值给所有键,不会为每个键生成独立的新对象。这里你传入的是一个单独的空字典,意味着album["classic"]和album["pop"]指向内存里完全相同的一个字典实例,不管你修改哪个键对应的子字典,本质都是在修改这同一个共享字典。
另外你写的内层遍历album.items()做匹配的逻辑完全多余,这层循环加上共享引用的问题,就导致每次匹配到对应流派往子字典加值时,两个流派的子字典因为是同一个对象,最终会存下所有的索引和播放量数据。
修复方案
不要给dict.fromkeys()传入列表、字典这类可变对象作为所有键的统一默认值,直接在遍历过程中给每个流派初始化独立的子字典即可,参考代码如下:
genres = ["classic", "pop", "classic", "classic", "pop"] plays = [500, 600, 150, 800, 2500] album = {} for i in range(len(genres)): genre = genres[i] # 流派第一次出现时,初始化一个独立的空字典 if genre not in album: album[genre] = {} album[genre][i] = plays[i]
运行上述代码就能得到预期结果:
{'classic': {0: 500, 2: 150, 3: 800}, 'pop': {1: 600, 4: 2500}}
如果你想提前初始化album结构,可以用字典推导式为每个流派生成独立的空字典,避免引用共享问题:
# 这种写法每个键对应的空字典都是独立创建的新对象 album = {g: {} for g in set(genres)}
内容的提问来源于stack exchange,提问作者jtoyhh
相关产品推荐
相关产品推荐

