Python には、リスト、セット、辞書など、非常に便利な組み込みデータ構造が多数あります。ほとんどの場合、これらのデータ構造を直接使用できます。ただし、通常は、検索、並べ替え、配置、フィルタリングなどの一般的な問題も考慮する必要があります。 この記事では、3 つの一般的なデータ構造とデータ関連のアルゴリズムを紹介します。さらに、コレクション モジュールには、さまざまなデータ構造のソリューションも含まれています。
1. 系列を個別の変数に分解する (1)問題点 N 個の要素を含むタプルまたはシーケンスがあり、それを N 個の個別の変数に分解したいと考えています。 (2)解決策 任意のシーケンス (または反復可能なオブジェクト) は、単純な代入操作で個別の変数に分割できます。 1 つの要件は、変数の合計数と構造がシーケンスのものと一致することです。例えば:
要素数が一致しない場合はエラーが発生します。例えば:
(3)議論 実際、タプルやリストだけでなく、オブジェクトが反復可能である限り、分解操作を実行できます。これには、文字列、ファイル、反復子、ジェネレーターが含まれます。例えば:
分解操作を行うときに、特定の値を破棄したい場合があります。 Python ではこれを行うための特別な構文は提供されていませんが、通常は、破棄する値の名前として未使用の変数名を選択できます。例えば:
ただし、他の場所で使用されていない変数名を選択するようにしてください。 2. 任意の長さの反復可能オブジェクトの要素を分解する (1)問題点 反復可能オブジェクトから N 個の要素をアンパックする必要がありますが、反復可能オブジェクトの長さが N を超える場合があり、「アンパックする値が多すぎます」という例外が発生します。 (2)解決策 この問題を解決するには、Python の「* 式」を使用できます。たとえば、あるコースが提供され、最終成績から最初と最後の課題を削除し、残りの中間の成績のみを平均することにしたとします。グレードが 4 つしかない場合は、単純に 4 つすべてを因数分解できるかもしれませんが、24 あった場合はどうなるでしょうか。 * 式を使用すると、すべてが簡単になります。
もう 1 つの使用例としては、名前と電子メール アドレス、それに続く任意の数の電話番号で構成されるユーザー レコードがいくつかあると想定します。次に、レコードを次のように分解します。
いくつの電話番号を因数分解する必要があるかに関係なく (または電話番号がない場合でも)、変数 phone_numbers は常にリストになり、意味がありません。そうすれば、変数 phone_numbers を使用するコードは、それがリストではないかもしれないという事実を心配する必要がなくなり、追加の型チェックを行う必要もなくなります。 * で変更された変数は、リストの最初の位置に置くこともできます。たとえば、過去 8 四半期の会社の売上を表す一連の値があるとします。直近の四半期の売上を過去 7 四半期の平均と比較する場合は、次のようにします。
Python インタープリターの観点から見ると、この操作は次のようになります。
(3)議論 この拡張分解操作は、長さが不明または任意の反復可能なオブジェクトを分解するためのカスタム ツールです。多くの場合、このような反復可能オブジェクトには既知のコンポーネントまたはパターンがあり (たとえば、要素 1 の後はすべて電話番号です)、* 式を使用して反復可能オブジェクトを分解すると、開発者は関連する要素を取得するために反復可能オブジェクト内で複雑な操作を実行する必要なく、これらのパターンを簡単に利用できます。 * スタイルの構文は、可変長のタプルのシーケンスを反復処理する場合に特に便利です。たとえば、ラベル付きタプルのシーケンスがあるとします。
この * スタイルの構文でサポートされている分解操作は、分割などの特定の文字列処理操作と組み合わせた場合にも非常に便利です。例えば:
場合によっては、特定の値を除外して破棄したい場合があります。分解する際には、* を一つだけ指定するのではなく、_ や ign (無視) など、破棄する値を表すためによく使われる変数名を複数使用することができます。例えば:
*分解操作は、さまざまな関数型言語のリスト処理関数とある程度類似しています。たとえば、リストがある場合、次のように簡単に先頭と末尾に分解できます。
この種の分割機能を実行する関数を作成する場合、何らかの高度な再帰アルゴリズムを実装することを意図していると思われるかもしれません。例えば:
ただし、再帰は固有の制限があるため、Python の強みではないことに注意してください。したがって、この最後の例には実用的な意味はあまりなく、単なる学術的な好奇心によるものです。 3. 最後のN要素を保存する (1)問題点 反復処理やその他の形式の処理中に、最後のいくつかのレコードの限定的な履歴記録を作成したいと考えています。 (2)解決策 限定された履歴レコードを保存することは、collections.deque のアプリケーション シナリオと見なすことができます。たとえば、次のコードは、一連のテキスト行に対して単純なテキスト マッチング操作を実行します。一致が見つかると、現在の一致行とチェックされたテキストの最後の N 行を出力します。
(3)議論 上記のコード スニペットのように、レコードを検索するコードを記述する場合、通常は yield キーワードを含むジェネレーター関数を使用します。これにより、検索を処理するコードと検索結果を使用するコードが適切に分離されます。ジェネレーターに慣れていない場合は、セクション 4.3 を参照してください。 deque(maxlen=N) は固定長のキューを作成します。新しいレコードが追加され、キューがいっぱいになると、最も古いレコードが自動的に削除されます。例えば:
このような操作 (追加、削除) はリストに対して手動で実行できますが、キュー ソリューションの方がはるかに洗練されており、実行速度もはるかに速くなります。 より一般的には、単純なキュー構造が必要な場合、 deque が役立ちます。キューのサイズを指定しない場合は、無制限のキューが取得され、両端で操作の追加とポップを実行できます。次に例を示します。
キューのどちらかの端から要素を追加またはポップする複雑さは O(1) です。これは、リストの先頭に要素を挿入したり削除したりする場合の複雑さが O(N) であるリストとは異なります。 |
<<: データサイエンスと機械学習のためのトップ 16 プラットフォーム
AIの次のチャンスはどこにあるのでしょうか? AIの概念が初めて提唱されたのは1956年なので、60...
[[415863]]多くの組織の AI 分析に対する要望と、組織の規模や能力との間のギャップは拡大し...
私たちはなぜ眠るのでしょうか? 明らかな理由の一つは、体と手足の力を回復することです。しかし、睡眠の...
Amazon Kendra は、自然言語処理やその他の機械学習技術を使用してエンタープライズ検索を...
インテリジェントエージェントにも「標準マニュアル」が必要です。 MetaGPTと呼ばれる研究では、イ...
[[214541]] 2017 年は、ウォール ストリート ジャーナル、フォーブス、フォーチュンなど...
プルーフ・オブ・ワーク最も一般的なブロックチェーンのコンセンサス アルゴリズムは、ビットコインのプル...
機械はどのように学習し、何を学ぶのでしょうか?人間はどうやって機械に学習を教えるのでしょうか?この記...
1. グラフデータベースとナレッジグラフが2022年に主流になる グラフ データベースが 2022 ...
比較的新しい概念である AIoT は、人工知能 (AI) とモノのインターネット (IoT) を組み...