web-dev-qa-db-ja.com

Pythonでslice()関数は何をしますか?

まず、質問を明確にしたいと思います:それは slice() 関数、notリストのスライスまたは_a[5:4:3]_のような文字列。

ドキュメントでは、この関数はNumPyで使用されており、使用例は示されていません(の使用方法と言われていますが、言われていないいつ使用するか)。さらに、私はneverでこの関数があらゆるPythonプログラムで使用されているのを見ました。

プレーンPython(NumPyまたはSciPyなし))でプログラミングするときに、slice()関数を使用する必要があるのはどのような例ですか?.

24
ForceBru

_a[x:y:z]_は、a[slice(x, y, z)]と同じ結果を返します。 sliceオブジェクトの利点の1つは、xy、およびzを保存する代わりに、単一のオブジェクトとして後で保存および取得できることです。

多くの場合、ユーザーが後でさまざまなケースに対処する必要なく、データに適用できる独自のスライスを定義できるようにするために使用されます。

27
enrico.bacis

いいえ、それだけではありません!

オブジェクトについては既に述べたように、最初に知っておく必要があるのは、スライスがクラスであり、オブジェクトではないということです。

Slice()インスタンスの2番目の使用法は、文字列、リストのように動作する独自のオブジェクトを作成するときに、引数をgetitem()およびgetslice()メソッドに渡すことです。 、およびスライスをサポートする他のオブジェクト。

行うとき:

print "blahblah"[3:5]

次のように自動的に変換されます。

print "blahblah".__getitem__(slice(3, 5, None))

したがって、独自のインデックス付けおよびスライスオブジェクトをプログラムする場合:

class example:
    def __getitem__ (self, item):
        if isinstance(item, slice):
            print "You are slicing me!"
            print "From", item.start, "to", item.stop, "with step", item.step
            return self
        if isinstance(item, Tuple):
            print "You are multi-slicing me!"
            for x, y in enumerate(item):
                print "Slice #", x
                self[y]
            return self
        print "You are indexing me!\nIndex:", repr(item)
        return self

それを試してみてください:

>>> example()[9:20]
>>> example()[2:3,9:19:2]
>>> example()[50]
>>> example()["String index i.e. the key!"]
>>> # You may wish to create an object that can be sliced with strings:
>>> example()["start of slice":"end of slice"]

古いPythonバージョンはgetitem()の代わりに使用されるメソッドgetslice()をサポートしていました。チェックインすることをお勧めしますgetitem()スライスを取得したかどうか、取得した場合はgetslice()メソッドにリダイレクトします。これにより、完全な下位互換性が得られます。

これは、numpyがマトリックス操作にslice()オブジェクトを使用する方法であり、間接的にどこでも常に使用されていることは明らかです。

5
Dalen

(関数のセマンティクスを使用)sliceクラスを呼び出すと、sliceオブジェクト(開始、停止、ステップ)がインスタンス化されます。これは、後でプログラムでスライス指定子として使用できます。

>>> myname='Rufus'
>>> myname[::-1] # reversing idiom
'sufuR'

>>> reversing_slice=slice(None,None,-1) # reversing idiom as slice object
>>> myname[reversing_slice]
'sufuR'

>>> odds=slice(0,None,2) # another example
>>> myname[odds]
'Rfs'

頻繁に使用するスライスがある場合、これは複数のプログラム領域で定数を使用するよりも好ましく、毎回入力する必要のある2つまたは3つの参照を保持する手間を省きます。

もちろん、インデックスのように見えますが、Pythonしばらく使用すると、すべてが一見したように見えないことがわかります。 reversing_sliceで行ったように、oddsに対してはあまり明確ではありません。

4
RufusVS

あなたの質問から、あなたは例を探していると思います。 sliceからのリストをrange(1, 20)からのステップで試してみたとき

>>> x = range(1, 20)

>>> x[1:20:3]
[2, 5, 8, 11, 14, 17]

>>> x[slice(1, 20, 3)]
[2, 5, 8, 11, 14, 17]
2
kiran.koduru