だから私はpythonで遊んでいて、少し奇妙に思われる何かに気づいた。リストから選択する際の_-1
_のセマンティクスは一貫していないようだ。
だから私は数字のリストを持っています
_ls = range(1000)
_
もちろん_ls[-1]
_の場合はリストの最後の要素ですが、その中のサブリストを取得して、中点から最後まですべてを取得する場合
_ls[500:-1]
_
しかし、これはリストの最後の要素を含むリストではなく、最後の要素までのすべてを含むリストを提供します。しかし、もし私が
_ls[0:10]
_
10番目の要素も含むリストを取得します(そのため、セレクターは包括的である必要があります)。なぜ_-1
_に対して機能しないのですか。
もちろん_ls[500:]
_またはls[500:len(ls)]
(これはばかげている)を行うことができます。私は-1との取引が何であるのかと思っていましたが、そこでは必要ないことを実感しました。
list[first:last]
には、last
は含まれません。
10番目の要素はls[9]
で、ls[0:10]
にはls[10]
がありません。
最後の要素を含むサブリストを取得したい場合、コロンの後に空白を残します:
>>> ll=range(10)
>>> ll
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ll[5:]
[5, 6, 7, 8, 9]
>>> ll[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
両方のインスタンスで一貫した動作が得られます。
>>> ls[0:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> ls[10:-1]
[10, 11, 12, 13, 14, 15, 16, 17, 18]
ただし、リストの10番目の要素はインデックス9であることに注意してください。これは、リストのインデックスが0であるためです。それはあなたのハングアップがある場所かもしれません。
言い換えると、 [0:10]
はインデックス0〜10からではなく、実質的に0から10番目の要素に移動します(10はスライスの最後に含まれないため、インデックス0〜9になります)。
-1は、シーケンスが逆方向に読み取られるという意味では特別ではなく、むしろ両端をラップします。 マイナス1はゼロマイナス1を意味し、排他的(そして、正のステップ値の場合、シーケンスは「左から右」に読み取られます).
i = [1, 2, 3, 4]
、i[2:-1]
は項目2からの先頭から1を引いたもの(または「around to the end」))を意味します。 [3]
。 -1番目の要素、または要素後方1は最後の4
、ただし排他的であるため、3を取得します。
これがある程度理解できることを願っています。
私にはかなり一貫しているようです。正のインデックスも含まれません。あなたはそれを間違っていると思います。 range()も非包括的であり、Python配列には0インデックスが付けられていることを思い出してください。ここに、サンプルのpythonセッションを示します。
>>> d = range(10)
>>> d
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> d[9]
9
>>> d[-1]
9
>>> d[0:9]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> d[0:-1]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> len(d)
10
配列をスライスするとき;
ls[y:x]
要素yからスライスを取得しますが、xは含みません。負のインデックスを使用する場合、それは
ls[y:-1] == ls[y:len(ls)-1]
そのため、スライスは最後の要素までになりますが、それは含まれません(スライスごとに)