2017-02-13 14 views
1

一つは反復可能で値のサブセットを取得する配列スライス表記を使用することができます。Python:なぜ[0,1,2] [ - 1:1]はエラーを発生させませんか? Pythonで

a = [0,1,2] 
a[0:2] 
# returns all members from the 0th to the 2nd: [0,1] 

最初の値が負のスライスを抽出しようとすると、第2の値が正の場合、しかし、リクエストは空のリストを返します。

a[-1:2] 
# returns [] 

これは私には直感に反する、-1で定義された範囲として:2:2 0で定義された範囲のスーパーセットのようです。

私は、Pythonのスライス表記法(例:a[-1]が2)で配列の最後からpluckするために負のインデックスを使うことができますが、最初のスライス位置では負の値、エラーを発生させるか、同じスライスから返された値のスーパーセットを最初の0の位置に戻します。

私は誰もが、この前面に洞察力を持っているために起こる場合は、2番目に正の値と第一の位置に負の値でスライス要求によって返された空のリストの背後にある動機を知りたいだろう...

+3

'a [-1:2]'は 'a [len(a)-1:2]となります。 – Kos

+0

私はそれを聞いています。しかし、最初の位置で負の値を持つスライスによって返された値が常に空の場合、言語でエラーが発生しないのはなぜですか?スライス関数の最初の位置に負の値が正当なユースケースではないようですので、この状況が発生した場合、開発者に警告する必要があるようです。 – duhaime

+0

@Kos私は、 'a [-1:2]'は、問題なしで-7をそこに置くことができるので、 'a [-1%len(a):2] 'と読みます。 – Nullman

答えて

9

負のインデックスは、最後の要素を取得するために非常に便利です:

>>> letters = list('abcdefgh') 
>>> letters[-3:] 
['f', 'g', 'h'] 
>>> letters[-3:-1] 
['f', 'g'] 

途中で、この場合に例外を発生させる大きな間違いだろう。

また、負および正の指標を混在させることができます:第五最後の要素の後、6要素の前の要素を意味

>>> letters[-5:6] 
['d', 'e', 'f'] 

を。あなたのケースでは

:最後の2つ目の間には要素がありませんので

>>> letters[-1:2] 
[] 

は空のリストを返します。

これは、しかし、常に空ではありません。

>>> ['a'][-1:2] 
['a'] 
>>> ['a','b'][-1:2] 
['b'] 
+0

ああ、そうです、私は考えていません。私の本当の質問は次のとおりです。最初の位置に負の値を持ち、2番目の位置に正の値を持つスライスのユースケースはありますか? – duhaime

+0

これで完全にクリアされます。私は今ユースケースを見る - ありがとう! – duhaime

3

私はそれだけで誤解だと思う:負の値は、「端から数えて」と解釈されているので、[-1:2][0:2]のスーパーセットではありません。それは別の方法です! -1が何であっても(実際の値はイテレートの長さによって異なります)、常に>= 0になります。

あなたの場合、長さ3の配列を持ちますので、-12と解釈され、2から2の間のアイテムを取得したい(排他的に停止します)ので、空のリストを取得します。

2

最後の10個の要素のスライスが必要だとします。これはa[-10:]で簡単に行えます。もしそれがエラーを起こすなら、あなたはa[len(a)-10:]のような不愉快なものを書くでしょう。さらに、aが前に使用したリストを持つ変数ではなく、今計算したものであれば、長さを取る可能性を持たせるために新しい変数を作成する必要があります。最後に[-10:]と書くことができます。

明らかに、これは意図された動作ではない場合がありますが、他の場合の簡潔さのために、おそらくそれに値するでしょう。

関連する問題