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

Python向字典键追加列表值返回None,defaultdict无效的技术问题

问题分析与解决办法

我来帮你捋捋问题出在哪哈~你的代码里有两个关键问题导致返回None:

  • append()方法的返回值是None:你在chain.setdefault(key, [].append(next_word))里用了[].append(next_word),但列表的append()方法不会返回新列表,而是直接修改原列表并返回None,这就导致对应键的值被设成了None。
  • setdefault的用法逻辑搞反了:setdefault本身就是用来处理“键不存在时设置默认值”的场景,你额外加的if-else判断完全没必要,反而把逻辑弄乱了。

修正后的普通字典写法

我们可以利用setdefault返回对应值的特性,直接拿到列表后追加元素,不用多余判断:

text = "ABBBAACCCCAABBCCCCAABCBCBCABCCCA"
chain = dict()
for i in range(len(text)-1):  # 别用text.__len__(),直接len(text)更符合Python规范
    key = text[i]
    next_word = text[i+1]
    # 不管键存不存在,先拿到对应的列表(不存在就自动创建空列表)
    current_list = chain.setdefault(key, [])
    current_list.append(next_word)

print(chain)

运行这段代码,你就能得到正确的结果:每个键对应一个包含后续字符的列表。

用collections.defaultdict(list)的正确写法

如果你想用defaultdict,其实写法更简洁,它会自动给不存在的键创建空列表,直接追加元素就行:

from collections import defaultdict

text = "ABBBAACCCCAABBCCCCAABCBCBCABCCCA"
chain = defaultdict(list)
for i in range(len(text)-1):
    key = text[i]
    next_word = text[i+1]
    chain[key].append(next_word)

# 如果需要转成普通字典,直接用dict(chain)就行
print(dict(chain))

为什么你之前用defaultdict没生效?

大概率是当时的写法有误,比如错误地把append的返回值赋值给了键,或者没有正确调用append。上面的写法是最简洁的正确用法,直接通过chain[key]拿到自动创建的列表,然后追加元素即可。

内容的提问来源于stack exchange,提问作者ET333

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:39:05