Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Defaultdict自动为每个键创建子dict?_Python_Python 3.x_Dictionary_Defaultdict - Fatal编程技术网

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}}})