PythonのスライスをスライスするPythonでは?


この記事はもともと1967年に出版されましたWhat is slicing in Python?
Pythonでのスライスは、文字列、タプル、リストのようなシーケンスの部分にアクセスできる機能です.また、リストのような変更可能なシーケンスの項目を変更または削除するためにそれらを使用することもできます.スライスはまた、Numpy配列だけでなく、パンダシリーズとデータフレームのようなサードパーティのオブジェクトに適用することができます.
スライスは、きれいで簡潔で、読みやすいコードを書くことを可能にします.
この項目では、インデックスとスライスの項目へのアクセス、変更、削除、および組み込みのクラスslice ()の使用方法について説明します.

インデックス


Pythonのシーケンス(文字列、タプル、リストなど)の単一の項目に対応する整数インデックスにアクセスできます.Pythonのインデックスはゼロベースです.これは、インデックス0がシーケンスの先頭(一番左)の項目、1番目から2番目の項目に対応することを意味する.
インデックスを使用する方法を説明するために、1つの文字列、1つのタプル、および1つのリストを作成します.
>>> str_ = 'Python is awesome!'
>>> str_
'Python is awesome!'
>>> tuple_ = (1, 2, 4, 8, 16, 32, 64, 128)
>>> tuple_
(1, 2, 4, 8, 16, 32, 64, 128)
>>> list_ = [1, 2, 4, 8, 16, 32, 64, 128]
>>> list_
[1, 2, 4, 8, 16, 32, 64, 128]
インデックスは括弧内で提供されます.
>>> str_[0]
'P'
>>> str_[1]
'y'
>>> str_[4]
'o'
>>> tuple_[0]
1
>>> tuple_[1]
2
>>> tuple_[4]
16
>>> list_[0]
1
>>> list_[1]
2
>>> list_[4]
16
あなたが見ることができるように、' P 'は文字列の最初の文字ですそしてインデックス0に対応し、yは2番目で、インデックス1などがあります.
タプルとリストと非常に似ています.
Pythonでは、負の整数インデックスも使用できます.これは実際には非常に有用であるように見えます.特にシーケンスの最後の(一番右の)項目にアクセスしたいとき.
インデックス- 1は最後の項目、- 2番目から2番目の最後のもの、
>>> str_[-1]
'!'
>>> str_[-2]
'e'
>>> str_[-5]
's'
>>> tuple_[-1]
128
>>> tuple_[-2]
64
>>> tuple_[-5]
8
>>> list_[-1]
128
>>> list_[-2]
64
>>> list_[-5]
8
ご覧の通り、登場人物!文字列' Pythonの最後の項目は素晴らしいですそしてインデックス- 1に相当する.また、インデックス17があり、StringChru[17]は‘’’を返す.「E」という文字はその直前に行われ、インデックス2と16を持つ.
再び、タプルとリストは同様に振る舞う.
インデックスを使用して、変更可能なシーケンスの項目を変更できます.Pythonでは、文字列とタプルは不変ですが、リストは変更可能です:
>>> list_[-1] = 100
>>> list_
[1, 2, 4, 8, 16, 32, 64, 100]
この例では、リストの最後の項目を100に変更します.このリストには8つの項目がありますので、ゼロベースのインデックス7で最後の項目にアクセスすることもできます.

スライス


スライスはインデックスに似ていますが、1つの項目の代わりに項目のシーケンスを返します.スライスに使用されるインデックスもゼロベースです.
スライス構文の2つの変形があります.本稿では両者を説明する.
構文シーケンス[ start : stop ]を使用すると、新しいシーケンスを取得します.これは、インデックスを開始し、項目の前にインデックスを停止してインデックスを開始してアイテムを開始します.言い換えると、文シーケンス[ start : stop ]は、項目シーケンス[ start ]、シーケンス[ stop - 1 ]、およびそれらの間のすべての項目を返します.
>>> str_[1:5]
'ytho'
>>> tuple_[2:4]
(4, 8)
>>> tuple_[2:3]
(4,)
>>> tuple_[2:2]
()
見ることができるように、start + 1 == stopのときに1つだけの項目を返すことができます.
開始を省略すると、値0が取られ、結果として得られるシーケンスが最初の開始時に開始されます.
>>> str_[:2]
'Py'
>>> tuple_[:4]
(1, 2, 4, 8)
停止しない場合は、結果のシーケンスは元の末尾に停止します.
>>> str_[2:]
'thon is awesome!'
>>> tuple_[4:]
(16, 32, 64, 128)
一貫して起動と停止の両方を省略できます.
>>> str_[:]
'Python is awesome!'
>>> tuple_[:]
(1, 2, 4, 8, 16, 32, 64, 128)
>>> list_[:]
[1, 2, 4, 8, 16, 32, 64, 100]
それはあなたがシーケンスの浅いコピーを得る方法です.
同様にstartとstopの負の値を適用することができます.
>>> str_[-8:]
'awesome!'
>>> tuple_[:-1]
(1, 2, 4, 8, 16, 32, 64)
>>> tuple_[-4:-2]
(8, 16)
>>> tuple_[3:5]
(8, 16)
TupleCountの場合、- 1から後ろに数えるとき、値- 4は0から前方にカウントするとき、値3と同じ項目に対応します.値は5と- 2と同じです.再び、インデックスストップに対応する項目は結果のシーケンスに含まれません.
構文シーケンス[ start : stop : step ]は似ていますが、詳細はほとんどありません.
いくつかの項目をスキップする場合は、ステップを指定する手順を使用できます.
>>> tuple_[1:5:2]
(2, 8)
この例では、ステップは2ですので、インデックス1(項目2)を持っている項目から始め、2番目のアイテムを集め、インデックス5(32)でアイテムに到達する前に停止します.あなたはアイテム2を取る、4をスキップし、8を取る.
ステップが肯定的で、開始を省略すると、結果のシーケンスは再び元の先頭から開始されます.停止することを省略すると、操作は元の端で停止します.しかし、ステップを省略すると、1と見なされ、構文シーケンス[ start : stop ]と同じ動作を得ることができます.
>>> tuple_[:6:2]
(1, 4, 16)
>>> tuple_[3::2]
(8, 32, 128)
>>> tuple_[1:5:]
(2, 4, 8, 16)
ステップの負の値は、stopより大きい開始と組み合わせて、項目を後方に収集するために使用できます.
>>> tuple_[4:1:-1]
(16, 8, 4)
>>> tuple_[6:1:-2]
(64, 16, 4)
否定的なステップと省略されたスタートの場合には、結果として生じるシーケンスはオリジナルの終わりから始まります.停止しない場合は、最初の操作で停止します.
>>> tuple_[:2:-1]
(128, 64, 32, 16, 8)
>>> tuple_[5::-1]
(32, 16, 8, 4, 2, 1)
これらの規則は便利であり、シーケンスの浅いコピーを逆の順序で、開始、停止の両方を省略して取得します.
>>> tuple_[::-1]
(128, 64, 32, 16, 8, 4, 2, 1)
スライスを使用して、変更可能なシーケンスの項目を変更できます.
>>> list_[1:6:2]
[2, 8, 32]
>>> list_[1:6:2] = [20, 80, 320]
>>> list_
[1, 20, 4, 80, 16, 320, 64, 100]
この例では、インデックス1、3、5の項目をアクセスして変更する.
構文シーケンス[ start : stop ]を使うと、シーケンスの一部を小さい方または大きい方に置き換えることができます.
>>> list_[1:5]
[20, 4, 80, 16]
>>> list_[1:5] = [0, 0]
>>> list_
[1, 0, 0, 320, 64, 100]
この例では、4つの項目を削除して([20,4,80,16])、2つの新しいもの([ 0,0 ])を代わりに追加します.
このロジックを実行すると、以下のような空のシーケンスで置換することで、変更可能なシーケンスの部分を削除できます.
>>> list_[1:3]
[0, 0]
>>> list_[1:3] = []
>>> list_
[1, 320, 64, 100]
また、del文でスライスを使用してシーケンスの一部を削除することもできます.
>>> list_[:2]
[1, 320]
>>> del list_[:2]
>>> list_
[64, 100]
したがって、リストの一部を削除する2つの方法があります.しかし、後者のステートメントを使用するので、何かを削除するあなたの意図を明らかにするため、後者は読みやすく、理解しやすいようです.

スライスは何ですか。


スライスはPython組み込みクラススライスのインスタンスです.あなたは、ステートメントスライス(開始、停止、ステップ)でそれらを作成します.スタートの代わりにスライスのインスタンスを渡すことができます.stop : step : start : start : stop :
>>> s = slice(1, 5, 2)
>>> s
slice(1, 5, 2)
>>> s.start, s.stop, s.step
(1, 5, 2)
>>> tuple_[s]
(2, 8)
もう一度、ステップを省略することができます.
>>> s = slice(1, 5)
>>> s.start, s.stop, s.step
(1, 5, None)
>>> tuple_[s]
(2, 4, 8, 16)
単一の引数を渡すと、スライスはSTOPとして使用し、次のように動作します.
>>> s = slice(5)
>>> s.start, s.stop, s.step
(None, 5, None)
>>> tuple_[s]
(1, 2, 4, 8, 16)
関数とメソッドのスライスを操作できます:
>>> def get_items_with_slice(sequence, start, stop, step):
...     return sequence[slice(start, stop, step)]
... 
>>> get_items_with_slice([1, 2, 4, 8, 16, 32, 64, 128], 1, 5, None)
[2, 4, 8, 16]
この関数は独自の引数を使用してスライスを作成し、シーケンスからデータを取得します.
最後に、Pythonの特殊メソッドCount GetIteCount ()と組み合わせてスライスを使用し、インスタンスをインデックス表記で使用できるクラスを定義する例を示します.
>>> class C:
...     def __init__(self, *args):
...         self.__data = args
...     def __getitem__(self, index_or_slice):
...         print('index or slice:', index_or_slice)
...         return self.__data[index_or_slice]
... 
>>> x = C(1, 2, 4, 8, 16, 32, 128)
>>> x[4]
index or slice: 4
16
>>> x[1:5:2]
index or slice: slice(1, 5, 2)
(2, 8)
整数を__getitem__() , それは自己の指標として振る舞う.データ.start : stop : stepを渡すと、実際に` getItemMenied () 'は引数としてスライスオブジェクトを取得します.
また、使用することができます__setitem__() データを変更する__delitem__() データを削除するには、潜在的にスライスと組み合わせる.

結論


この記事では、Pythonでスライスを使用する方法を示します.文字列、タプル、リストのようなシーケンスから項目を抽出する必要があるときは、非常に強力で便利です.また、Numpy配列やPandasシリーズやデータフレームなどのサードパーティ製のオブジェクトもあります.
関数とメソッドのスライスを使用できます.インスタンス[ IndexXorOrStrip ]表記でデータをアクセス、変更、削除する可能性のあるクラスを定義する場合は、特別なメソッドを実装する必要があります__getitem__(), __setitem__(), or __delitem__() スライスを適用します.
読んでくれてありがとう!