如何用defaultdict构建嵌套字典并向newKey列表追加元素?
解决嵌套defaultdict追加元素的报错问题
这个错误的根源很好理解——你一开始把mydict定义成了defaultdict(list),所以当你访问mydict[x]时,它会自动生成一个空列表,而不是字典。你后来给这个列表append了一个字典{'newKey': []},这时候mydict[x]其实是[{'newKey': []}](一个包含字典的列表),自然没法用字符串'newKey'去索引它,列表只认整数或切片索引,这就是报错的原因。
要实现你想要的{x: {'newKey': [100]}}这种嵌套字典结构,你需要把defaultdict的默认工厂改成另一个defaultdict(类型为list),这样每一个mydict[x]都会自动生成一个默认值为列表的字典。代码如下:
from collections import defaultdict # 嵌套的defaultdict:外层字典的默认值是一个"值为列表的defaultdict" mydict = defaultdict(lambda: defaultdict(list)) # 直接向目标键对应的列表追加元素 x = "test_key" mydict[x]['newKey'].append(100) mydict[x]['newKey'].append(200) # 转成普通字典便于查看结果 print(dict(mydict)) # 输出:{'test_key': {'newKey': [100, 200]}}
这样做的好处是,不管是外层的键(比如x)还是内层的键(比如newKey),第一次访问时都会自动生成对应的结构,不需要手动初始化字典或列表,完全满足你“持续向newKey追加元素”的需求。
如果你最终需要的是纯普通字典(而非defaultdict实例),可以在操作完成后把外层和内层都转成普通字典:
# 批量把内层defaultdict转成普通字典 result = {k: dict(v) for k, v in mydict.items()} print(result) # 输出同样是:{'test_key': {'newKey': [100, 200]}}
内容的提问来源于stack exchange,提问作者AGH_TORN
相关产品推荐
相关产品推荐

