ホームページ >バックエンド開発 >Python チュートリアル >Python collections.defaultdict() と dict の使用法と違い
Pythonにはモジュールコレクションがあり、データ型コンテナモジュールとして説明されています。よく使われる collections.defaultdict() があります。主にこのことについて話します。
概要:
ここでのdefaultdict(function_factory)は、キーの値がそれ自体で決定され割り当てられる辞書のようなオブジェクトを構築しますが、値の型はfunction_factoryのクラスインスタンスであり、デフォルト値。たとえば、default(int) は辞書のようなオブジェクトを作成し、その中の値はすべて int のインスタンスになります。また、それが存在しないキーであっても、d[key] にはデフォルト値が設定されます。 int() のデフォルト値は、欠損値を提供するファクトリ関数を呼び出す 0.
defaultdict
dict サブクラスです。
これは簡単な説明です
defaultdict は組み込み関数 dict のサブクラスに属し、ファクトリ関数を呼び出して欠損値を提供します。
ファクトリ関数とは何ですか:
Pythonコアプログラミングからの説明
Python 2.2では型とクラスが統合され、すべての組み込み型は現在クラスになっています。これに基づいて、元の
いわゆる組み込み型が作成されます。 int()、type()、list() などの変換関数がファクトリ関数になりました。 つまり、関数のように見えますが、実際にはクラスです。これらを呼び出すと、商品を生産する工場と同じように、実際にそのタイプのインスタンスが生成されます。
次のよく知られたファクトリー関数は、古い Python バージョンでは組み込み関数と呼ばれます:
int()、long()、float()、complex()
str()、unicode()、basestring ()
list()、tuple()
type()
これまでファクトリ関数を持たなかった他の型にもファクトリ関数が追加されました。さらに、新しいスタイル クラスをサポートする新しいデータ型に対応するファクトリ関数も追加されました
。これらのファクトリー関数は以下にリストされています:
dict()
bool()
set()、frozenset()
object()
classmethod()
staticmethod()
super()
property ( )
file()
その使い方をもう一度見てみましょう:
import collections s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] d = collections.defaultdict(list) for k, v in s: d[k].append(v) list(d.items())
ここで、defaultdict が組み込み関数リストをパラメータとして受け入れることができることがわかりました。実は list() 自体は組み込み関数なのですが、アップデート後は python 内のすべてがオブジェクトになるため、list がクラス化され、list の導入時にクラスのインスタンスが生成されます。
まだよくわからないので、defaultdict のヘルプの説明をもう一度見てみましょう
class collections.defaultdict([default_factory[, ...]])
defaultdict のサブクラスである新しい辞書のようなオブジェクトを返します。組み込みの dict クラス。1 つのメソッドをオーバーライドし、1 つの書き込み可能なインスタンス変数を追加します。残りの機能は dict クラスの場合と同じなので、ここでは説明しません。
まず第一に、collections.defaultdict は辞書のようなものを返します。オブジェクトは似ていることに注意してください。オブジェクトはまったく同じオブジェクトではありません。 defaultdict クラスは、メソッドをオーバーロードし、書き込み可能なインスタンス変数を追加する点を除いて、dict クラスとほぼ同じです。 (書き込み可能なインスタンス変数、まだ理解できません)
最初の引数は、default_factory 属性の初期値を提供します。残りの引数はすべて、dict コンストラクターに渡された場合と同じように扱われます。キーワード引数。
defaultdict オブジェクトは、標準の dict 操作に加えて次のメソッドをサポートします:
__missing__(key)
default_factory 属性が None の場合、キーを引数として KeyError 例外が発生します。 None ではなく、指定されたキーのデフォルト値を提供するために引数なしで呼び出され、この値がキーの辞書に挿入されて返されます。
主にこれに焦点を当てます。default_factory が None でない場合、この default_factory はパラメータのないフォームが呼び出され、__missing__ メソッドのキーにデフォルト値が提供されます。 このデフォルト値はデータ ディクショナリにキーとして挿入され、返されます。
とてもめまいがする。 __missing__ メソッドがあります。この __missing__ メソッドは collections.defaultdict() の組み込みメソッドです。
default_factory を呼び出すと例外が発生する場合、この例外は変更されずに伝播されます。
このメソッドは、要求されたキーが見つからない場合に dict クラスの __getitem__() メソッドによって呼び出され、返されるか発生するものは __getitem__ によって返されます。 ().
__missing__() は __getitem__() 以外の操作では呼び出されないことに注意してください。これは、get() が、default_factory を使用するのではなく、通常の辞書と同様に、デフォルトとして None を返すことを意味します。
defaultdict オブジェクトは以下をサポートします。インスタンス変数:
default_factory
この属性は __missing__() メソッドによって使用され、存在する場合は最初の引数からコンストラクターに初期化され、存在しない場合は None に初期化されます。
このドキュメントでは、理解する 。例を直接見てください:
結果を見てくださいimport collections s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] # defaultdict d = collections.defaultdict(list) for k, v in s: d[k].append(v) # Use dict and setdefault g = {} for k, v in s: g.setdefault(k, []).append(v) # Use dict e = {} for k, v in s: e[k] = v ##list(d.items()) ##list(g.items()) ##list(e.items())
python help上也这么说了
When each key is encountered for the first time, it is not already in the mapping; so an entry is automatically created using the default_factory function which returns an empty list. The list.append() operation then attaches the value to the new list. When keys are encountered again, the look-up proceeds normally (returning the list for that key) and the list.append() operation adds another value to the list. This technique is simpler and faster than an equivalent technique using dict.setdefault():
说这种方法会和dict.setdefault()等价,但是要更快。
有必要看看dict.setdefault()
setdefault(key[, default])
If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.
如果这个key已经在dictionary里面存着,返回value.如果key不存在,插入key和一个default value,返回Default. 默认的defaults是None.
但是这里要注意的是defaultdict是和dict.setdefault等价,和下面那个直接赋值是有区别的。从结果里面就可以看到,直接赋值会覆盖。
从最后的d.values还有d[“blue”]来看,后面的使用其实是和dict的用法一样的,唯一不同的就是初始化的问题。defaultdict可以利用工厂函数,给初始keyi带来一个默认值。
这个默认值也许是空的list[] defaultdict(list), 也许是0, defaultdict(int).
再看看下面的这个例子。
defaultdict(int) 这里的d其实是生成了一个默认为0的带key的数据字典。你可以想象成 d[key] = int default (int工厂函数的默认值为0)
d[k]所以可以直接读取 d[“m”] += 1 就是d[“m”] 就是默认值 0+1 = 1
后面的道理就一样了。
>>> s = 'mississippi' >>> d = defaultdict(int) >>> for k in s: ... d[k] += 1 ... >>> list(d.items()) [('i', 4), ('p', 2), ('s', 4), ('m', 1)]