48

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

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

ls = range(1000)

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

ls[500:-1]

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

ls[0:10]

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

もちろん、ls[500:]またはすることもできますls[500:len(ls)](これはばかげています)。-1との取引は何だろうと思っていたのですが、そこでは必要ないことに気づきました。

4

6 に答える 6

109

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

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

于 2010-08-10T16:28:25.290 に答える
28

最後の要素を含むサブリストを取得する場合は、コロンの後に空白のままにします。

>>> 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]
于 2013-05-09T08:09:28.330 に答える
4

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

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

ただし、リストは0インデックスであるため、リストの10番目の要素はインデックス9にあることに注意してください。それはあなたのハングアップがある場所かもしれません。

つまり、[0:10]インデックス0から10までではなく、実質的に0から10番目の要素に移動します(10はスライスの最後に含まれないため、インデックス0から9になります)。

于 2010-08-10T16:29:55.907 に答える
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
于 2010-08-10T16:30:07.700 に答える
3

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

ls[y:x]  

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

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

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

于 2010-08-10T16:30:29.480 に答える
3

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

したがってi = [1, 2, 3, 4]i[2:-1]、項目2から最初から1を引いたもの(または「最後まで」)を意味し、結果として[3]。-1番目の要素、または要素0の後方1は最後4ですが、排他的であるため、3を取得します。

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

于 2010-08-10T16:40:52.027 に答える