4

通常、リストを逆にするには、次のようにする必要があります。

>>>>l = [1, 2, 3, 4, 5]
>>>>l[::-1]  
[5, 4, 3, 2, 1]

しかし、このような正確な構文ではありません:

list[<start>:<end>:<stop>]

オプションのパラメータを指定しない場合、デフォルトは次のとおりです(間違っている場合は修正してください:

<start> = 0(Beginning of list)
<end>   = 5(Length of list)
<step>  = 1

したがって、オプションのパラメーターを指定すると、実際には同じ結果が得られるはずです。

>>>>l[0:5:-1]
>>>>[]

しかし、代わりに空のリストを取得します(そして、なぜこれが発生するのかを知っています)が、最初のケースでpythonがとるデフォルト値は何ですか?デフォルトとして0と5を取り、何も生成しないか、[::-1 ] list [start:end:stop]とは異なります

4

3 に答える 3

4

l[::-1]と同等です。l[slice(None,None,-1)]ここで、スライスオブジェクトをslice([start], stop[, step])返します。次のことを考慮してください。

>>> slice(None,None,-1).indices(5)
(4, -1, -1)
>>> slice(None,None,1).indices(5)
(0, 5, 1)

これは、拡張インデックス構文を使用してリストにアクセスするときに表示される正確な動作ですl[start:stop:step]

>>> l[::-1]
[5, 4, 3, 2, 1]
>>> l[slice(None,None,-1)]
[5, 4, 3, 2, 1]

...しかし、最初のケースでpythonがとるデフォルト値は何ですか?

開始/停止の値(指定されていない場合)は、インデックスの数(リストの長さ)との値に基づいていますstep具体的には、スライスオブジェクトのCPythonソースを参照してください(Objects/sliceobject.c

if (r->start == Py_None) {
    *start = *step < 0 ? length-1 : 0;
} else {
    /* .... */
}

if (r->stop == Py_None) {
    *stop = *step < 0 ? -1 : length;
} else {
    /* .... */
}
于 2012-05-28T17:31:06.213 に答える
2

ステップがリストの最後の開始よりも負の場合は、負のインデックスを使用してそれを行うことができます。

試す:

l[-1:-6:-1]
于 2012-05-28T17:27:27.610 に答える
0

リストを逆方向に歩いている場合は、開始と停止が逆になります。これを試してください。

l[5:0:-1]

興味深いことに、5つの要素のうち4つだけをスライスします(「end」は終わりを過ぎたものであると想定されているため)。これは機能しません。

l[5:-1:-1]

これはあなたが望んでいることをします:

l[5::-1]
于 2012-05-28T17:24:17.147 に答える