2011-08-17 8 views
5

私はpython3のスライスについて読んでいます。 その後、プログラムを書いて、getitem(self、slice(s))を実装しようとしました。 次のコードは行く:[python]:python3でスライスを実装する方法は?

class NewList: 
    def __init__(self, lst): 
     print('new list') 
     self._list = lst 
    def __getitem__(self, x): 
     if type(x) is slice: 
      return [ self._list[n] for n in range(x.start, x.stop, x.step) ] #error? 
     else: 
      return self._list[x] 
    ... 

nl1 = NewList([1,2,3,4,5]) 
nl1[1:3] #error occurs 

、私はx.stepの範囲は例外を発生作っなし、ではありませんが分かりました。 getitemメソッドを実装するにはどうすればよいですか?

+0

また、 'NewList'クラスは' list'から継承する必要があります... – JBernardo

+0

@JBernardo - スライスオブジェクトを明示的に使用しないでください。 – Alcott

答えて

2

を。あなたのシーケンスの長さを考えると、それはスタートのタプルを返し、停止、ステップ:あなたは、この必須パラメータを回避するための明白なトリックがある、あなたのオブジェクトの長さを知らない場合には

>>> s = slice(2, 5, None) 
>>> s.indices(10) 
(2, 5, 1) 

>>> [x for x in range(*s.indices(10))] 
[2, 3, 4] 

>>> s.indices(3) 
(2, 3, 1) 

>>> s.indices(0) 
(0, 0, 1) 
0

x.step or 1

class NewList: 
    def __init__(self, lst): 
     print('new list') 
     self._list = lst 
    def __getitem__(self, x): 
     if type(x) is slice: 
      return [ self._list[n] for n in range(x.start, x.stop, x.step or 1) ] #error? 
     else: 
      return self._list[x] 

nl1 = NewList([1,2,3,4,5]) 
nl1[1:3] 
+0

これは問題を回避する方法ですが、私が読んだことによると、いいえ。 – Alcott

2

xがスライスである場合は、他の条件と同じ行うことができます:あなたはslice.indicesメソッドを使用する必要が

return self._list[x] 
+0

絶対にはいですが、私はそれを自分で行う方法を知りたいだけです。 – Alcott

+0

@Alcott、「自分でやってください」という意味がわかりません。 –

+1

申し訳ありませんが、__getitem __(self、slice)がどのようにリストに実装されているか知りたいと思っています。 – Alcott

4

。例えば、無限シーケンスののGetItemは次のようになります。

def __getitem__(self, key) : 
    if isinstance(key, slice) : 
     m = max(key.start, key.stop) 
     return [self[ii] for ii in xrange(*key.indices(m+1))] 
    elif isinstance(key, int) : 
     #Handle int indices 

あなたがたが、これはあまりにも処理することができなしのチェックで開始と停止与えていない場合にのみ失敗します。

+0

'xrange'はpython3に存在しません。代わりに' range'を使うべきです。また、この実装を使うと、 'max:'が 'None '型を扱うことができないので、' [:4] 'のようなスライスを持つことはできません。代わりに、開始と停止が 'None'でないかどうかをチェックし、そうであれば、それぞれをゼロとlenのアイテムに割り当てます。また、 'range'に' key.step'を含めると良いでしょう。 – sazary

関連する問題