web-dev-qa-db-ja.com

Python list / sublist selection -1 weirdness

だから私はpythonで遊んでいて、少し奇妙に思われる何かに気づいた。リストから選択する際の_-1_のセマンティクスは一貫していないようだ。

だから私は数字のリストを持っています

_ls = range(1000)
_

もちろん_ls[-1]_の場合はリストの最後の要素ですが、その中のサブリストを取得して、中点から最後まですべてを取得する場合

_ls[500:-1]
_

しかし、これはリストの最後の要素を含むリストではなく、最後の要素までのすべてを含むリストを提供します。しかし、もし私が

_ls[0:10]
_

10番目の要素も含むリストを取得します(そのため、セレクターは包括的である必要があります)。なぜ_-1_に対して機能しないのですか。

もちろん_ls[500:]_またはls[500:len(ls)](これはばかげている)を行うことができます。私は-1との取引が何であるのかと思っていましたが、そこでは必要ないことを実感しました。

35
Matti Lyra

list[first:last]には、lastは含まれません。

10番目の要素はls[9]で、ls[0:10]にはls[10]がありません。

79
dugres

最後の要素を含むサブリストを取得したい場合、コロンの後に空白を残します:

>>> 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]
14
mcane

両方のインスタンスで一貫した動作が得られます。

>>> 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になります)。

4
eldarerathis

-1は、シーケンスが逆方向に読み取られるという意味では特別ではなく、むしろ両端をラップします。 マイナス1はゼロマイナス1を意味し、排他的(そして、正のステップ値の場合、シーケンスは「左から右」に読み取られます).

i = [1, 2, 3, 4]i[2:-1]項目2からの先頭から1を引いたもの(または「around to the end」))を意味します。 [3]。 -1番目の要素、または要素後方1は最後の4、ただし排他的であるため、3を取得します。

これがある程度理解できることを願っています。

2
Stefano Palazzo

私にはかなり一貫しているようです。正のインデックスも含まれません。あなたはそれを間違っていると思います。 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
1
Yoni Samlan

配列をスライスするとき;

ls[y:x]  

要素yからスライスを取得しますが、xは含みません。負のインデックスを使用する場合、それは

ls[y:-1] == ls[y:len(ls)-1]

そのため、スライスは最後の要素までになりますが、それは含まれません(スライスごとに)

1
Andy