我已经阅读了python文档中的示例,但仍然不明白这个方法是什么意思。有人能帮帮我吗?下面是python文档中的两个例子

>>> from collections import defaultdict

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]

and

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

参数int和list是干什么用的?


当前回答

文档和解释几乎是不言自明的:

http://docs.python.org/library/collections.html#collections.defaultdict

类型函数(int/str等)作为参数传递,用于初始化dict中没有的任何给定键的默认值。

其他回答

这里有一个关于defaultdicts的很好的解释:http://ludovf.net/blog/python-collections-defaultdict/

基本上,参数int和list是传递的函数。记住,Python接受函数名作为参数。Int默认返回0,而list在使用括号调用时返回空列表。

在正常的字典中,如果在你的例子中我尝试调用d[a],我会得到一个错误(KeyError),因为只有键m, s, I和p存在,键a还没有初始化。但在defaultdict中,它接受函数名作为参数,当您尝试使用未初始化的键时,它只是调用您传入的函数并将其返回值分配为新键的值。

简而言之:

Defaultdict (int) -参数int表示值将是int类型。

Defaultdict (list) -参数列表指示值将是列表类型。

文档和解释几乎是不言自明的:

http://docs.python.org/library/collections.html#collections.defaultdict

类型函数(int/str等)作为参数传递,用于初始化dict中没有的任何给定键的默认值。

由于这个问题是关于“它是如何工作的”,一些读者可能想了解更多的具体细节。具体来说,问题中的方法是__missing__(key)方法。参见:https://docs.python.org/2/library/collections.html#defaultdict-objects。

更具体地说,这个答案展示了如何以一种实用的方式使用__missing__(key): https://stackoverflow.com/a/17956989/1593924

为了澄清'callable'的含义,这里有一个交互式会话(来自2.7.6,但也适用于v3):

>>> x = int
>>> x
<type 'int'>
>>> y = int(5)
>>> y
5
>>> z = x(5)
>>> z
5

>>> from collections import defaultdict
>>> dd = defaultdict(int)
>>> dd
defaultdict(<type 'int'>, {})
>>> dd = defaultdict(x)
>>> dd
defaultdict(<type 'int'>, {})
>>> dd['a']
0
>>> dd
defaultdict(<type 'int'>, {'a': 0})

这是defaultdict最典型的用法(除了毫无意义地使用x变量)。你可以使用0作为显式默认值,但不能使用简单的值:

>>> dd2 = defaultdict(0)

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    dd2 = defaultdict(0)
TypeError: first argument must be callable

相反,下面的函数可以工作,因为它传递了一个简单的函数(它动态地创建了一个无参数且总是返回0的无名函数):

>>> dd2 = defaultdict(lambda: 0)
>>> dd2
defaultdict(<function <lambda> at 0x02C4C130>, {})
>>> dd2['a']
0
>>> dd2
defaultdict(<function <lambda> at 0x02C4C130>, {'a': 0})
>>> 

并且使用不同的默认值:

>>> dd3 = defaultdict(lambda: 1)
>>> dd3
defaultdict(<function <lambda> at 0x02C4C170>, {})
>>> dd3['a']
1
>>> dd3
defaultdict(<function <lambda> at 0x02C4C170>, {'a': 1})
>>> 
#dictinary and defaultdict

normaldictionary=dict()
print(type(normaldictionary))
#print(normaldictionary["keynotexisit"])
#Above normal dictionary give an error as key not present

from collections import defaultdict
defaultdict1=defaultdict()
print(type(defaultdict1))
#print(defaultdict1['keynotexisit'])
######################################

from collections import defaultdict
default2=defaultdict(int)
print(default2['keynotexist'])

https://msatutorpy.medium.com/different-between-dictionary-and-defaultdictionary-cb215f682971