在Python中更新和创建多维字典

10

我正在解析存储各种代码片段的JSON,首先我正在构建这些片段使用的语言字典:

snippets = {'python': {}, 'text': {}, 'php': {}, 'js': {}}

然后在遍历JSON时,我想将关于代码片段的信息添加到其自己的字典中,添加到上面列出的字典中。例如,如果我有一个JS代码片段,则最终结果将是:

snippets = {'js': 
                 {"title":"Script 1","code":"code here", "id":"123456"}
                 {"title":"Script 2","code":"code here", "id":"123457"}
}

不要混淆视听 - 但在PHP中处理多维数组时,我会只做以下操作(寻找类似的东西):

snippets['js'][] = array here

我知道有一两个人讨论如何创建多维字典,但似乎无法找到在Python中将字典添加到另一个字典中的方法。感谢您的帮助。

2个回答

18
这被称为自动充填
你可以使用defaultdict实现。
def tree():
    return collections.defaultdict(tree)

d = tree()
d['js']['title'] = 'Script1'

如果想要列表,可以这样做:
d = collections.defaultdict(list)
d['js'].append({'foo': 'bar'})
d['js'].append({'other': 'thing'})

defaultdict的想法是在访问键时自动创建元素。顺便说一句,对于这种简单情况,你可以简单地执行以下操作:

d = {}
d['js'] = [{'foo': 'bar'}, {'other': 'thing'}]

这正是我要建议的,但从他的第二个代码片段来看,似乎他想让“js”返回一个字典列表。 - placeybordeaux
@placeybordeaux 我并不是很喜欢 php,但我相当确定他们的“Array”对象可能会根据月亮位置或其他因素表现为列表或字典... - JBernardo
我对PHP没有好感,但是我指的是snippets = {'js':{"id":"3"}{"id":"2"}},看起来他想要一个附加到js、text、python等的字典列表。我喜欢defaultdicts,尤其是递归定义的defaultdicts,但是它们似乎不能完全满足他的需求。 - placeybordeaux
1
@placeybordeaux 我认为他不小心把那一行复制了两次... 可能一个 defaultdict(list) 可以解决这个问题。 - JBernardo
是的,我确实想要在其中使用多个字典,因此我会查看defaultdict(list),如果您能提供一个示例,那就太好了。看起来@placeybordeaux的答案可以满足我的需求,但是当学习一门新语言时,我喜欢学习不同的方法。谢谢。 - gregwhitworth
为什么 PHP 总是受到诟病 - 至少它本身就能处理自动赋值,你不需要在执行任何操作之前定义一个函数 :-) - user2761030

8

snippets = {'js': 
                 {"title":"Script 1","code":"code here", "id":"123456"}
                 {"title":"Script 2","code":"code here", "id":"123457"}
}

看起来您想要一个字典列表。以下是一些Python代码,希望能得到您想要的结果。

snippets = {'python': [], 'text': [], 'php': [], 'js': []}
snippets['js'].append({"title":"Script 1","code":"code here", "id":"123456"})
snippets['js'].append({"title":"Script 1","code":"code here", "id":"123457"})
print(snippets['js']) #[{'code': 'code here', 'id': '123456', 'title': 'Script 1'}, {'code': 'code here', 'id': '123457', 'title': 'Script 1'}]

这样清楚明了吗?


很棒,你需要更详细地解释吗?如果它解决了你的问题,请记得接受答案。 - placeybordeaux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接