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
相关产品推荐
相关产品推荐

