You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 01:57:26