web-dev-qa-db-ja.com

Pythonのリスト、シーケンス、スライスの違いは?

これらの組み込みPythonデータ型:リストシーケンスおよびスライスの違いは何ですか?私はそれを見る、3つすべては本質的にC++とJava呼び出し配列

24
Tony the Pony
  • listは単なる配列以上のものです。アイテム数を指定せずに初期化できます。あなたはそれらにappend/Pushすることができます、あなたはそれらからremove/pop/delアイテムをすることができます、あなたは異なるリストを持つことができますオブジェクトのタイプ(例:_[1,'e', [3]]_)、再帰リストを持つことができます...そしてリストをスライスすることができます。これは、いくつかのアイテムのみで新しいリストを取得することを意味します。
  • sliceは、help(slice)が示すように、_a[start:stop:step]_形式で拡張スライスを処理するために「舞台裏」で使用されるオブジェクトタイプです。

「シーケンス」はオブジェクトではなく、listのようないくつかのオブジェクトが実装する非公式のインターフェースのようなものです。

11
badp

あなたはあなたの質問に非常に異なるものを混ぜているので、私はただ別の質問に答えます;-P

あなたは今、Pythonで最も重要なインターフェースの1つについて質問しています:iterable-基本的にはfor elem in iterableのように使用できるものなら何でもです。

iterableには、sequencegenerator、およびmappingの3つの子孫があります。

  • sequenceは、ランダムアクセスで反復可能です。シーケンスの前にアイテムを消費することなく、シーケンスの任意のアイテムを要求できます。このプロパティを使用すると、一度に複数の要素を提供するslicesを作成できます。スライスはサブシーケンスseq[from:until]とn番目ごとのアイテム:seq[from:until:nth]を与えることができます。 listTuple、およびstrはすべてシーケンスです。

  • 整数位置ではなくキーを介してアクセスする場合は、マッピングになります。 dictは基本的なマッピングです。

  • 最も基本的な反復可能はgeneratorです。ランダムアクセスをサポートしていないため、スライスはサポートされていません。あなたはそれらが与えられた順序ですべてのアイテムを消費しなければなりません。ジェネレーターは通常、アイテムを反復処理した場合にのみアイテムを作成します。 generatorsを作成する一般的な方法は、ジェネレータ式です。 (f(x) for x in y)のように丸括弧が付いていることを除けば、リスト内包表記とまったく同じように見えます。 yieldキーワードを使用する関数を呼び出すと、ジェネレーターも返されます。

すべてのイテレータに共通のアダプタはイテレータです。 iteratorsは、サポートする最も基本的なタイプであるgeneratorと同じインターフェースを持っています。これらは、イテラブルでiterを呼び出すことによって明示的に作成され、あらゆる種類のループ構造で暗黙的に使用されます。

46
Jochen Ritzel

リストはシーケンスですが、シーケンスは必ずしもリストではありません。シーケンスは、シーケンスインターフェイス(「プロトコル」)をサポートする任意のタイプです。これは、厳密な継承階層ではなく、ダックタイピングによって行われます。シーケンスはコンテナですが、コンテナは必ずしもシーケンスではないことに注意してください。 (シーケンスは、まあ、シーケンシャルです!)

http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-Tuple-buffer-xrange を参照してください。

スライスオブジェクトは通常、シンタックスシュガー(foo[2:5])を介して暗黙的に作成され、オーバーライドできるコンテナタイプの特別なメソッド(__getitem__など)に提供されます。独自のシーケンス/コンテナを作成しない限り、通常はスライスを処理する必要はありません。

http://docs.python.org/reference/datamodel.html#specialnames を参照してください

リストは配列に相当します。確かではありませんが、動的に拡張する配列としてcPythonに実装されていると思います。ただし、インターフェイスを使用すると、単なる古い配列というよりも、C++ STLベクターのようになります。

6
Jeremy Brown
  • listsは、配列に似たシーケンスタイプです

  • sequenceタイプは、機能的なスーパーセットを記述します。

シーケンスタイプには、文字列、Unicode文字列、リスト、タプル、バッ​​ファ、およびxrangeオブジェクトの6つがあります。

  • slicesは、サブ配列(または部分文字列も)の表記です

続きを読む... http://docs.python.org/glossary.html

5
miku

厳密に言えば、スライスはインデックスの範囲を表すタイプです。スタート、ストップ、そしてステップ。スライスはコンテナタイプではありません。スライスを使用してリストにインデックスを付けると、元のリストのサブリストのコピーである新しいリストが作成されます。

リストは、異種であるという点でC++配列とは異なります。要素は同じタイプである必要はありません。そして、MYYNがすでに指摘しているように、「シーケンス」はPython型ではなく、さまざまな組み込み型の説明です。

2
Peter Milley