Pythonの配列を解説!
プログラミングを始めたり、Python について学習したりしている場合は、この記事が最適です。配列は最もよく使用されるデータ構造の 1 つです。Python はどのように配列を表現するのでしょうか? Python で配列を操作してさまざまな問題を解決するにはどうすればよいでしょうか? これがこの記事で明らかになることです。
コンピュータはどのように情報を保存するのでしょうか?
ご存知のとおり、コンピューター内の情報の最も基本的な形式は、情報の断片で構成されています。これらの情報の 8 ビットがグループ化されて、いわゆるバイトが形成されます。
コンピューターはこれらのバイトの非常に大きな塊を保存できるため、バイトを迅速に読み書きできる新しいメカニズムが必要です。個人の自宅の住所が、自分が住んでいる場所と隣人を区別するのと同じように、ここでメモリ アドレスが機能します。コンピューターはメモリ アドレスを使用して、さまざまなデータや情報が存在する場所を区別します。
また、コンピュータがメモリ アドレスに到達するのに O(1) のアクセス時間がかかることにも言及する価値があります。これは、バイト #5489637 へのアクセスはバイト #64 へのアクセスと同じであることを意味します。
配列とは何ですか?
プログラミング言語では、変数を使用してメモリ内のアドレスを参照するのが一般的です。たとえば、識別子 X はバイト #32 を参照できます。
複数のメモリアドレスを保存したい場合、複数の識別子を作成することは効率的でなく、スケーラブルでもありません。識別子のグループに 1 つの名前を付け、特定の識別子にアクセスするために番号を使用できれば、より望ましいと考えられます。このような表現は配列です。言い換えれば、コンピューターのメモリの連続部分にある変数のグループの表現です。
たとえば、Python の文字列はこの方法で保存されます。たとえば、Python が割り当てるテキスト「example」を使用して新しい変数を宣言するとします。
2 バイト (Unicode 文字を格納するために必要なメモリ) * 7 (単語の例の文字数) = この変数を格納するための連続したメモリの 14 バイト。
参照配列
Python は、参照配列である別のタイプの配列を使用します。それらを理解するために、この例を見てみましょう。ホテルを所有していて 50 部屋あるとします。どの部屋に誰が宿泊しているかの名前を保存する方法が必要です。次のような表現:
これを行うには、Python は割り当てられる連続したメモリ空間の条件を尊重する必要があります。しかし、名前の長さが異なる場合 (長さが異なるとスペース要件も異なる)、これをどのように行うのでしょうか?
解決策の 1 つは、最大の文字列の長さを見つけて、すべての文字列に十分なメモリ領域を割り当てることですが、これでは一部の領域が無駄になるためメモリ効率が悪くなります。また、最大の文字列となった新しい文字列が出現した場合はどうなるでしょうか。
これを解決するために、Python は複数のオブジェクトへの連続した参照の配列を作成します。そのため、個々のオブジェクトのサイズが異なる場合でも、そのメモリ アドレスを格納するために使用されるメモリは同じになります。このようにして、Python は配列のさまざまな要素への一定のアクセス時間を保証します。このタイプの配列を参照配列と呼びます。
これを説明するには 、次の画像を見てください。
Python のリストとタプルは、このタイプの配列を使用してデータを保存します。
注: 参照配列は参照を指すため、リスト内の値を誤って変更する可能性があるため、参照値を変更するときは注意してください。また、コピーを作成するときは、浅いコピーと深いコピーの違いを必ず理解してください。
コンパクトアレイ
以前、文字列と、それを連続メモリの配列に格納する方法について説明しました。実際、この配列をコンパクト配列と呼びます。
参照配列よりもコンパクトな配列を使用する利点は、メモリ参照の保存による余分なオーバーヘッドがないことです。プライマリ データを直接保存します。言及する価値のあるもう 1 つの利点は、参照配列であるリストを使用する場合、たとえリストがデータの場所への参照を保持していても、Python はデータの保存場所を制御できないことです。ハードウェアの仕組みにより、同じ計算に使用される可能性があるため、データを互いに近づけたほうが効率的です。
これらの利点にもかかわらず、Python はリストとタプルに対して、使いやすい参照配列を使用します。ただし、どうしてもコンパクトな配列を使用したい場合は、Python がこれを実行できるarrayと呼ばれるモジュールを提供します。
i ここで、最初の引数として に渡していることに気づきましたarray。コンパクトな配列を作成するには、適切なメモリ割り当ての型を指定する必要があるためです。他のデータ型については、次の表を確認してください。
アレイモジュールについて詳しく知りたい場合は、ここをクリックしてください。
配列モジュールの欠点の 1 つは、ユーザー定義のデータ型をサポートしていないことです。このようなデータ構造を持つコンパクトな配列は、モジュールctypesを使用して定義できます。
動的配列
コンパクトな配列を作成するときは、コンピューターが割り当てるメモリを認識できるように、その配列の正確なサイズを指定します。隣接するメモリ領域を他の配列に割り当てるためです。
実際には、配列のサイズを常に知ることができるわけではなく、時間の経過とともに拡大する可能性があります。この問題の解決策として、Python ではDynamic Array と呼ばれる抽象化が提供されています。
この抽象化では、実際のリストの長さを超える容量を持つ基礎となる配列を維持するリスト インスタンスを使用します。この追加容量は、リストにさらに多くのデータを追加するのに役立ちます。
最終的に余分な容量を使い果たすと、ダイナミック アレイは新しいより大きなアレイを要求し、すべての要素を新しいアレイにコピーし、システムは古いアレイからスペースを再利用します。
Python List はこの抽象化に基づいていますが、タプルと文字列は不変 (変更できない) ため、これに基づいていません。
動的配列はサイズが拡大するだけでなく、リストから要素を削除すると縮小する可能性があることにも言及する価値があります。
リストとタプル
したがって、上のセクションで行った分析から、リストとタプルのメソッドを 2 種類のメソッドに分けることができます。
不変メソッド:タプルとリストの両方に存在し、内容を変更しないメソッド。以下は、これらのメソッドとその時間計算量の表です。
変更メソッド:基になるデータとリストの構造を変更するため、リスト内にのみ存在するメソッド。以下は、これらのメソッドとその時間計算量の表です。
ここでは各メソッドの動作については説明しませんでしたが (直感的で簡単です)、Python のリストとタプルについて詳しく知ることができます。
テイクアウト
- 参照配列は、配列メモリに参照を保存し、参照を通じて実際の値にアクセスします。
- コンパクト配列は、実際のデータを連続したメモリに保存します。
- 動的配列は、要素の数に応じて自動的に拡大および縮小する配列です。
- リストは参照配列と動的配列に基づいています。
- タプルは参照配列に基づいています。
- 文字列はコンパクトな配列に基づいています。
リンクトイン:https://www.linkedin.com/in/mohamed-aziz-belaweid/
GitHub:https://github.com/azayz
私の他のストーリーを読んでください:
REALM : 検索拡張言語モデルの事前トレーニング、 顔の感情認識、実践ガイド!購読すると、何かを投稿するたびに通知が届きます。

![とにかく、リンクリストとは何ですか?[パート1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































