目次
判定ステートメントを使用して確認する
dict.setdefault() メソッドを使用します
Collections.defaultdict クラスを使用します。これで辞書にデフォルト値がないという問題はある程度解決しますが、このとき疑問に思うのは、辞書自体にデフォルト値の機能を提供するものがあるのか​​ということです。答えは「はい」です、それは collections.defaultdict です。
defaultdict クラスはバージョン 2.5 以降に追加されましたが、一部の古いバージョンではサポートされていないため、古いバージョンに対して互換性のあるdefaultdict クラスを実装する必要があります。これは実際には非常に単純で、パフォーマンスはバージョン 2.5 に付属の defautldict クラスほど良くないかもしれませんが、機能的には同じです。
ホームページ バックエンド開発 Python チュートリアル Pythonのdefaultdictの詳しい解説(コード例)

Pythonのdefaultdictの詳しい解説(コード例)

Oct 25, 2018 pm 05:34 PM
defaultdict python

この記事では、Python のdefaultdict の詳細な説明 (コード例) を紹介します。一定の参考値があります。必要な友人は参照してください。お役に立てば幸いです。

デフォルト値は非常に便利です

ご存知のとおり、Python では、辞書に存在しないキーにアクセスすると、KeyError 例外が発生します。が発生します (JavaScript では、オブジェクト属性に特定のキーが存在しない場合、unknown が返されます)。ただし、辞書内のすべてのキーにデフォルト値があると非常に便利な場合があります。たとえば、次の例は次のとおりです。

strings = ('puppy', 'kitten', 'puppy', 'puppy',
           'weasel', 'puppy', 'kitten', 'puppy')
counts = {}
for kw in strings:
    counts[kw] += 1
ログイン後にコピー

この例では、文字列内に単語が出現する回数をカウントし、カウント ディクショナリに記録します。単語が出現するたびに、カウントに対応するキーに格納されている値が 1 ずつ増加します。しかし、実際には、このコードを実行すると KeyError 例外がスローされます。発生のタイミングは、各単語が初めてカウントされたときです。Python の辞書にはデフォルト値がないため、Python コマンド ラインで確認できます:

>>> counts = dict()
>>> counts
{}
>>> counts['puppy'] += 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: &#39;puppy&#39;
ログイン後にコピー

判定ステートメントを使用して確認する

この場合、最初に思いつく方法は、単語を初めてカウントするときに、対応するカウント数のキーにデフォルト値 1 を格納することです。これには、処理中に判断ステートメントを追加する必要があります:
strings = (&#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;, &#39;puppy&#39;,
           &#39;weasel&#39;, &#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;)
counts = {}
for kw in strings:
    if kw not in counts:
        counts[kw] = 1
    else:
        counts[kw] += 1
# counts:
# {&#39;puppy&#39;: 5, &#39;weasel&#39;: 1, &#39;kitten&#39;: 2}
ログイン後にコピー

dict.setdefault() メソッドを使用します

また、dict.setdefault() メソッドを通じてデフォルト値を設定することもできます:

strings = (&#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;, &#39;puppy&#39;,
           &#39;weasel&#39;, &#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;)
counts = {}
for kw in strings:
    counts.setdefault(kw, 0)
    counts[kw] += 1
ログイン後にコピー

dict.setdefault() メソッドは 2 つのパラメータを受け取ります。最初のパラメータはキーの名前で、2 番目のパラメータはデフォルト値です。指定されたキーがディクショナリに存在しない場合は、パラメータに指定されたデフォルト値が返され、それ以外の場合は、ディクショナリに保存されている値が返されます。 for ループ内のコードは、dict.setdefault() メソッドの戻り値を使用してより簡潔にするために書き直すことができます。

strings = (&#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;, &#39;puppy&#39;,
           &#39;weasel&#39;, &#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;)
counts = {}
for kw in strings:
    counts[kw] = counts.setdefault(kw, 0) + 1
ログイン後にコピー

Collections.defaultdict クラスを使用します。これで辞書にデフォルト値がないという問題はある程度解決しますが、このとき疑問に思うのは、辞書自体にデフォルト値の機能を提供するものがあるのか​​ということです。答えは「はい」です、それは collections.defaultdict です。

defaultdict クラスは dict に似ていますが、タイプを使用して初期化されます:

>>> from collections import defaultdict
>>> dd = defaultdict(list)
>>> dd
defaultdict(<type &#39;list&#39;>, {})
ログイン後にコピー

defaultdict クラスの初期化関数は、パラメータとしてタイプを受け入れます。アクセスされるキーが存在しない場合、それは値をデフォルト値として変更します:

>>> dd[&#39;foo&#39;]
[]
>>> dd
defaultdict(<type &#39;list&#39;>, {&#39;foo&#39;: []})
>>> dd[&#39;bar&#39;].append(&#39;quux&#39;)
>>> dd
defaultdict(<type &#39;list&#39;>, {&#39;foo&#39;: [], &#39;bar&#39;: [&#39;quux&#39;]})
ログイン後にコピー

この形式のデフォルト値は、

dict[key] または dict を介してのみ渡されることに注意してください。 __getitem__(key)アクセス時のみ有効 以下にその理由を紹介します。

>>> from collections import defaultdict
>>> dd = defaultdict(list)
>>> &#39;something&#39; in dd
False
>>> dd.pop(&#39;something&#39;)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: &#39;pop(): dictionary is empty&#39;
>>> dd.get(&#39;something&#39;)
>>> dd[&#39;something&#39;]
[]
ログイン後にコピー

このクラスは、初期化関数のパラメータとして型名を受け入れることに加えて、パラメータなしで呼び出し可能な関数を使用することもできます。その際、関数の戻り結果がデフォルト値として使用されます。これにより、デフォルト値の値がより柔軟になります。次の例では、初期化関数のパラメーターとしてパラメーターなしでカスタム関数 zero() を使用する方法を示しています。

>>> from collections import defaultdict
>>> def zero():
...     return 0
...
>>> dd = defaultdict(zero)
>>> dd
defaultdict(<function zero at 0xb7ed2684>, {})
>>> dd[&#39;foo&#39;]
0
>>> dd
defaultdict(<function zero at 0xb7ed2684>, {&#39;foo&#39;: 0})
ログイン後にコピー

collections.defaultdict を使用して、初期単語統計の問題を解決します。

from collections import defaultdict
strings = (&#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;, &#39;puppy&#39;,
           &#39;weasel&#39;, &#39;puppy&#39;, &#39;kitten&#39;, &#39;puppy&#39;)
counts = defaultdict(lambda: 0)  # 使用lambda来定义简单的函数
for s in strings:
    counts[s] += 1
ログイン後にコピー

defaultdict クラスの実装方法

上記の内容を通じて、defaultdict クラスの使用法を理解したはずです。つまり、デフォルト値を実装する方法は次のとおりです。 defaultdict クラス関数についてはどうですか?これの鍵となるのは、__missing__() メソッドの使用です。

>>> from collections import defaultdict
>>> print defaultdict.__missing__.__doc__
__missing__(key) # Called by __getitem__ for missing key; pseudo-code:
  if self.default_factory is None: raise KeyError(key)
  self[key] = value = self.default_factory()
  return value
ログイン後にコピー

__missing__() メソッドの docstring を見ると、存在しないオブジェクトにアクセスするために __getitem__() メソッドを使用していることがわかります。 key (形式 dict[key] は実際には __getitem__() メソッドの簡略化された形式です)。このメソッドは __missing__() メソッドを呼び出してデフォルト値を取得し、キーを辞書に追加します。

__missing__() メソッドの詳細については、Python の公式ドキュメントの「マッピング タイプ — dict」セクションを参照してください。

バージョン 2.5 以降、ドキュメントで導入されました。dict から派生したサブクラスが __missing__() メソッドを定義している場合、存在しないキーにアクセスするときに、dict[key] は __missing__() メソッドを呼び出して取得します。デフォルト値。

このことから、dict は __missing__() メソッドをサポートしていますが、このメソッドは dict 自体には存在せず、派生サブクラスに実装する必要があることがわかります。これは簡単に検証できます:

>>> print dict.__missing__.__doc__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object &#39;dict&#39; has no attribute &#39;__missing__&#39;
ログイン後にコピー

同時に、さらなる実験を行ってサブクラス Missing を定義し、__missing__() メソッドを実装できます:

>>> class Missing(dict):
...     def __missing__(self, key):
...         return &#39;missing&#39;
...
>>> d = Missing()
>>> d
{}
>>> d[&#39;foo&#39;]
&#39;missing&#39;
>>> d
{}
ログイン後にコピー

戻り結果は __missing__( ) メソッドは機能します。これに基づいて、__missing__() メソッドをわずかに変更して、このサブクラスが defautldict クラスのような存在しないキーのデフォルト値を設定するようにします。

>>> class Defaulting(dict):
...     def __missing__(self, key):
...         self[key] = &#39;default&#39;
...         return &#39;default&#39;
...
>>> d = Defaulting()
>>> d
{}
>>> d[&#39;foo&#39;]
&#39;default&#39;
>>> d
{&#39;foo&#39;: &#39;default&#39;}
ログイン後にコピー

古いバージョンの Python でのdefaultdict の関数の実装

defaultdict クラスはバージョン 2.5 以降に追加されましたが、一部の古いバージョンではサポートされていないため、古いバージョンに対して互換性のあるdefaultdict クラスを実装する必要があります。これは実際には非常に単純で、パフォーマンスはバージョン 2.5 に付属の defautldict クラスほど良くないかもしれませんが、機能的には同じです。

まず第一に、アクセス キーが失敗した場合、 __getitem__() メソッドは __missing__() メソッドを呼び出す必要があります。

class defaultdict(dict):
    def __getitem__(self, key):
        try:
            return dict.__getitem__(self, key)
        except KeyError:
            return self.__missing__(key)
ログイン後にコピー

次に、

__missing__() メソッドを実装する必要があります。デフォルト値を設定するには:

class defaultdict(dict):
    def __getitem__(self, key):
        try:
            return dict.__getitem__(self, key)
        except KeyError:
            return self.__missing__(key)
    def __missing__(self, key):
        self[key] = value = self.default_factory()
        return value
ログイン後にコピー

次に、defaultdict クラスの初期化関数

__init__() は型または呼び出し可能な関数パラメーターを受け入れる必要があります:

class defaultdict(dict):
    def __init__(self, default_factory=None, *a, **kw):
        dict.__init__(self, *a, **kw)
        self.default_factory = default_factory    def __getitem__(self, key):
        try:
            return dict.__getitem__(self, key)
        except KeyError:
            return self.__missing__(key)
    def __missing__(self, key):
        self[key] = value = self.default_factory()
        return value
ログイン後にコピー

最后,综合以上内容,通过以下方式完成兼容新旧Python版本的代码:

try:
    from collections import defaultdictexcept ImportError:
    class defaultdict(dict):
      def __init__(self, default_factory=None, *a, **kw):
          dict.__init__(self, *a, **kw)
          self.default_factory = default_factory      def __getitem__(self, key):
          try:
              return dict.__getitem__(self, key)
          except KeyError:
              return self.__missing__(key)

      def __missing__(self, key):
          self[key] = value = self.default_factory()
          return value
ログイン後にコピー

以上がPythonのdefaultdictの詳しい解説(コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PSが荷重を見せ続ける理由は何ですか? PSが荷重を見せ続ける理由は何ですか? Apr 06, 2025 pm 06:39 PM

PSの「読み込み」の問題は、リソースアクセスまたは処理の問題によって引き起こされます。ハードディスクの読み取り速度は遅いか悪いです。CrystaldiskInfoを使用して、ハードディスクの健康を確認し、問題のあるハードディスクを置き換えます。不十分なメモリ:高解像度の画像と複雑な層処理に対するPSのニーズを満たすためのメモリをアップグレードします。グラフィックカードドライバーは時代遅れまたは破損しています:ドライバーを更新して、PSとグラフィックスカードの間の通信を最適化します。ファイルパスが長すぎるか、ファイル名に特殊文字があります。短いパスを使用して特殊文字を避けます。 PS独自の問題:PSインストーラーを再インストールまたは修理します。

PSの負荷速度をスピードアップする方法は? PSの負荷速度をスピードアップする方法は? Apr 06, 2025 pm 06:27 PM

Slow Photoshopの起動の問題を解決するには、次のような多面的なアプローチが必要です。ハードウェアのアップグレード(メモリ、ソリッドステートドライブ、CPU)。時代遅れまたは互換性のないプラグインのアンインストール。システムのゴミと過剰な背景プログラムを定期的にクリーンアップします。無関係なプログラムを慎重に閉鎖する。起動中に多数のファイルを開くことを避けます。

PSが開始されたときにロードの問題を解決する方法は? PSが開始されたときにロードの問題を解決する方法は? Apr 06, 2025 pm 06:36 PM

ブートがさまざまな理由によって引き起こされる可能性がある場合、「読み込み」に巻き込まれたPS:腐敗したプラグインまたは競合するプラグインを無効にします。破損した構成ファイルの削除または名前変更。不十分なプログラムを閉じたり、メモリをアップグレードしたりして、メモリが不十分であることを避けます。ソリッドステートドライブにアップグレードして、ハードドライブの読み取りをスピードアップします。 PSを再インストールして、破損したシステムファイルまたはインストールパッケージの問題を修復します。エラーログ分析の起動プロセス中にエラー情報を表示します。

HTML次ページ関数 HTML次ページ関数 Apr 06, 2025 am 11:45 AM

<p>次のページ関数は、HTMLを介して作成できます。手順には、コンテナ要素の作成、コンテンツの分割、ナビゲーションリンクの追加、他のページの隠し、スクリプトの追加が含まれます。この機能により、ユーザーはセグメント化されたコンテンツを閲覧でき、一度に1つのページのみを表示し、大量のデータやコンテンツを表示するのに適しています。 </p>

遅いPSの読み込みはコンピューター構成に関連していますか? 遅いPSの読み込みはコンピューター構成に関連していますか? Apr 06, 2025 pm 06:24 PM

PSの負荷が遅い理由は、ハードウェア(CPU、メモリ、ハードディスク、グラフィックスカード)とソフトウェア(システム、バックグラウンドプログラム)の影響を組み合わせたものです。ソリューションには、ハードウェアのアップグレード(特にソリッドステートドライブの交換)、ソフトウェアの最適化(システムガベージのクリーンアップ、ドライバーの更新、PS設定のチェック)、およびPSファイルの処理が含まれます。定期的なコンピューターのメンテナンスは、PSのランニング速度を改善するのにも役立ちます。

PSがファイルを開いたときにロードの問題を解決する方法は? PSがファイルを開いたときにロードの問題を解決する方法は? Apr 06, 2025 pm 06:33 PM

「ロード」は、PSでファイルを開くときに発生します。理由には、ファイルが大きすぎるか破損しているか、メモリが不十分で、ハードディスクの速度が遅い、グラフィックカードドライバーの問題、PSバージョンまたはプラグインの競合が含まれます。ソリューションは、ファイルのサイズと整合性を確認し、メモリの増加、ハードディスクのアップグレード、グラフィックカードドライバーの更新、不審なプラグインをアンインストールまたは無効にし、PSを再インストールします。この問題は、PSパフォーマンス設定を徐々にチェックして使用し、優れたファイル管理習慣を開発することにより、効果的に解決できます。

PSが常にロードされていることを常に示しているときに、ロードの問題を解決する方法は? PSが常にロードされていることを常に示しているときに、ロードの問題を解決する方法は? Apr 06, 2025 pm 06:30 PM

PSカードは「ロード」ですか?ソリューションには、コンピューターの構成(メモリ、ハードディスク、プロセッサ)の確認、ハードディスクの断片化のクリーニング、グラフィックカードドライバーの更新、PS設定の調整、PSの再インストール、優れたプログラミング習慣の開発が含まれます。

H5ページの制作と従来のWebページの違いは何ですか H5ページの制作と従来のWebページの違いは何ですか Apr 06, 2025 am 07:03 AM

従来のWebページでのH5ページの重要な違いは、モバイルの優先順位と柔軟性であり、モバイルデバイスにより適しており、開発効率が高まり、クロスプラットフォームの互換性が向上しています。具体的には、H5ページでは、セマンティックタグ、マルチメディアサポート、オフラインストレージ、地理的位置などの新機能を紹介し、モバイルエクスペリエンスを向上させます。

See all articles