701

Python docs の例を読みましたが、このメソッドが何を意味するのかまだわかりません。誰か助けてくれませんか?python docs からの2つの例を次に示します

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

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

パラメータintlistは何のためですか?

4

16 に答える 16

764

通常、Pythonディクショナリは、KeyError現在ディクショナリにないキーを持つアイテムを取得しようとすると、をスローします。対照的に、defaultdictアクセスしようとするアイテムを作成するだけです(もちろん、それらがまだ存在しない場合)。このような「デフォルト」アイテムを作成するには、コンストラクターに渡す関数オブジェクトを呼び出します(より正確には、関数オブジェクトと型オブジェクトを含む任意の「呼び出し可能」オブジェクトです)。最初の例では、デフォルトのアイテムはを使用して作成されint()、整数オブジェクトを返します0。2番目の例では、デフォルトのアイテムはlist()、を使用して作成されます。これは、新しい空のリストオブジェクトを返します。

于 2011-05-05T15:49:23.923 に答える
268

defaultdictキーがディクショナリに見つからない場合、KeyErrorスローされる代わりに、新しいエントリが作成されることを意味します。この新しいエントリのタイプは、defaultdictの引数によって指定されます。

例えば:

somedict = {}
print(somedict[3]) # KeyError

someddict = defaultdict(int)
print(someddict[3]) # print int(), thus 0
于 2011-05-05T15:48:56.420 に答える
125

デフォルト辞書

「標準辞書には、値を取得し、値が存在しない場合にデフォルトを設定するための setdefault() メソッドが含まれています。対照的defaultdictに、コンテナが初期化されるときに、呼び出し元がデフォルト (返される値) を事前に指定できるようにします。」

The Python Standard Library by ExampleDoug Hellmannによって定義されている

デフォルトディクトの使い方

defaultdict のインポート

>>> from collections import defaultdict

defaultdict を初期化する

渡して初期化する

最初の引数としてcallable (必須)

>>> d_int = defaultdict(int)
>>> d_list = defaultdict(list)
>>> def foo():
...     return 'default value'
... 
>>> d_foo = defaultdict(foo)
>>> d_int
defaultdict(<type 'int'>, {})
>>> d_list
defaultdict(<type 'list'>, {})
>>> d_foo
defaultdict(<function foo at 0x7f34a0a69578>, {})

** 2 番目の引数としてのkwargs (オプション)

>>> d_int = defaultdict(int, a=10, b=12, c=13)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})

また

>>> kwargs = {'a':10,'b':12,'c':13}
>>> d_int = defaultdict(int, **kwargs)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})

それはどのように機能しますか

標準辞書の子クラスと同様に、すべて同じ機能を実行できます。

ただし、不明なキーを渡すと、エラーではなくデフォルト値が返されます。例:

>>> d_int['a']
10
>>> d_int['d']
0
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12, 'd': 0})

デフォルト値を変更したい場合は、default_factory を上書きします:

>>> d_int.default_factory = lambda: 1
>>> d_int['e']
1
>>> d_int
defaultdict(<function <lambda> at 0x7f34a0a91578>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0})

また

>>> def foo():
...     return 2
>>> d_int.default_factory = foo
>>> d_int['f']
2
>>> d_int
defaultdict(<function foo at 0x7f34a0a0a140>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0, 'f': 2})

質問の例

例 1

int が default_factory として渡されているため、不明なキーはデフォルトで 0 を返します。

文字列がループに渡されると、d のアルファベットの数が増えます。

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

例 2

リストが default_factory として渡されているため、不明な (存在しない) キーはデフォルトで [ ] (つまりリスト) を返します。

タプルのリストがループで渡されると、d[color] に値が追加されます

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> d.default_factory
<type 'list'>
>>> for k, v in s:
...     d[k].append(v)
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
>>> d
defaultdict(<type 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})
于 2015-03-21T04:58:33.497 に答える
19

ここに defaultdicts の優れた説明があります: http://ludovf.net/blog/python-collections-defaultdict/

基本的に、パラメータintlistは渡す関数です。Python は関数名を引数として受け入れることに注意してください。intはデフォルトで 0 を返し、 listは括弧を付けて呼び出すと空のリストを返します。

通常の辞書では、あなたの例で を呼び出そうとd[a]すると、キー m、s、i、および p のみが存在し、キー a が初期化されていないため、エラー (KeyError) が発生します。ただし、defaultdict では、関数名を引数として取ります。初期化されていないキーを使用しようとすると、渡された関数が呼び出され、その戻り値が新しいキーの値として割り当てられます。

于 2013-06-09T17:48:31.727 に答える
10

質問は「どのように機能するか」に関するものであるため、一部の読者はもっとナットとボルトを見たいと思うかもしれません. 具体的には、問題のメソッドは__missing__(key)メソッドです。https://docs.python.org/2/library/collections.html#defaultdict-objectsを参照してください。

より具体的には、この回答は__missing__(key)実用的な方法で使用する方法を示しています: https://stackoverflow.com/a/17956989/1593924

「呼び出し可能」の意味を明確にするために、インタラクティブ セッションを次に示します (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})
>>> 
于 2014-12-01T23:54:11.990 に答える
3

がなければdefaultdict、見えないキーに新しい値を割り当てることはできますが、変更することはできません。例えば:

import collections
d = collections.defaultdict(int)
for i in range(10):
  d[i] += i
print(d)
# Output: defaultdict(<class 'int'>, {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9})

import collections
d = {}
for i in range(10):
  d[i] += i
print(d)
# Output: Traceback (most recent call last): File "python", line 4, in <module> KeyError: 0
于 2017-12-19T18:04:29.120 に答える
1

標準ディクショナリには、値を取得し、値が存在しない場合にデフォルトを設定する setdefault() メソッドが含まれています。対照的に、defaultdict を使用すると、コンテナーが初期化されるときに、呼び出し元が事前にデフォルトを指定できます。

import collections

def default_factory():
    return 'default value'

d = collections.defaultdict(default_factory, foo='bar')
print 'd:', d
print 'foo =>', d['foo']
print 'bar =>', d['bar']

これは、すべてのキーが同じデフォルトを持つことが適切である限り、うまく機能します。デフォルトが、リスト、セット、さらには int など、値の集約または累積に使用される型である場合に特に役立ちます。標準ライブラリのドキュメントには、defaultdict をこのように使用する例がいくつか含まれています。

$ python collections_defaultdict.py

d: defaultdict(<function default_factory at 0x100468c80>, {'foo': 'bar'})
foo => bar
bar => default value
于 2014-12-30T14:05:12.280 に答える
-9

ドキュメントと説明は、ほとんど一目瞭然です。

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

引数として渡された型関数 (int/str など) は、キーが dict に存在しない任意のキーのデフォルト値を初期化するために使用されます。

于 2011-05-05T15:50:11.617 に答える