Python Defaultdict自动为每个键创建子dict?
我有一本字典,我经常在我的代码中做这样的事情:Python Defaultdict自动为每个键创建子dict?,python,python-3.x,dictionary,defaultdict,Python,Python 3.x,Dictionary,Defaultdict,我有一本字典,我经常在我的代码中做这样的事情: special_dict = {} # ... if username not in special_dict: special_dict[username] = {} for subkey in ["Subkey1", "Subkey2", "Subkey3"]: special_dict[username][subkey] = [] # or {}
special_dict = {}
# ...
if username not in special_dict:
special_dict[username] = {}
for subkey in ["Subkey1", "Subkey2", "Subkey3"]:
special_dict[username][subkey] = [] # or {}, etc, depending on usecase
基本上我想要一个字典,其中对于每个用户名,值是另一个包含三个特定子键的字典,然后这些值是列表或集合,或者你拥有的
我熟悉defaultdict,但我不知道如何使这里的“值类型”非常具体。通常,如果我希望每个值在默认情况下都是一个列表,我会执行defaultdict(list)
,但是有没有办法使默认值不是一个列表,而是一个特定类型的字典
理想情况下,我希望最终能够做的是
特殊的[username][subkey]。追加(item)
,不必首先担心用户名是否存在,因为如果用户名不存在,它将成为一个键并形成三个子键。您需要一个函数来创建所需的结构,并将此函数作为参数传递给defaultdict
:
from collections import defaultdict
def name_subdict():
return {'key1':[], 'key2':set(), 'key3':{}}
mydict = defaultdict(name_subdict)
mydict['John']['key1'].append(1)
mydict['John']['key2'].add(2)
mydict['Jane']['key3'][10] = 20
print(mydict)
# defaultdict(<function name_subdict at 0x7fcaf81193a0>,
# {'John': {'key1': [1], 'key2': {2}, 'key3': {}},
# 'Jane': {'key1': [], 'key2': set(), 'key3': {10: 20}}})
有没有办法让数据类型可以通过?像
mydict=defaultdict(name_subct(list))
那样返回return{'key1':[],'key2':[],'key3':[]}
而如果我这样做mydict=defaultdict(name_subct(set))
它将返回返回{'key1':{},'key2':{},'key3':{}
或其他任何东西,或者每一个都必须用name_子目录中的if语句来处理吗?是的,你可以看到编辑过的答案。谢谢伙计!非常有用的信息,知道为什么关闭了这个?这不仅仅是一个“如何制作嵌套词典”的问题,拜托,链接的副本是错误的。它主要处理扁平化词典。这可能是一个更好的副本:。(我看不到在不重新打开问题的情况下更改重复链接的方法。)
from collections import defaultdict
def name_subdict(data_type):
# data type must be a callable like list, set, dict...
def subdict_creator():
return {key:data_type() for key in ['key1', 'key2', 'key3']}
return subdict_creator
my_list_dict = defaultdict(name_subdict(list))
my_set_dict = defaultdict(name_subdict(set))
my_list_dict['John']['key1'].append(1)
my_list_dict['John']['key2'].append(2)
my_set_dict['Jane']['key3'].add(10)
print(my_list_dict)
# defaultdict(<function name_subdict.<locals>.subdict_creator at 0x7fcadbf27b80>,
# {'John': {'key1': [1], 'key2': [2], 'key3': []}})
print(my_set_dict)
# defaultdict(<function name_subdict.<locals>.subdict_creator at 0x7fcadbbf25e0>,
# {'Jane': {'key1': set(), 'key2': set(), 'key3': {10}}})