0

次の例を見てください。

a = range(10)  

次のように、リストを左から右に進めることができます:a[0], a[1], ...., a[9] または、逆に負のインデックスを使用します:a[-1], a[-2], a[-3], ....

範囲にインデックスを付けることも可能です。a[from:to-1]

最後の要素のインデックスが -1 であることはわかっているので、(理論的な考えでは) 0 から -1 (-1 を含む) までなa[0:0]ので、リスト全体を配信する必要があると言えます。a[0:0-1]

これは間違っていますが、なぜですか?a[0:](リスト全体)編集よりも私には理にかなっています:

簡単に言うと (ちょっと疑問に思っているだけです! ^^ ) a[from:to-1]: わかりました、リスト全体を取得したいのですが、(この推論に従って): (これは空のリストです)、しかしねえ、0-1 は最後の要素ですよね?fromtoa[0:0]

4

5 に答える 5

2

インデックス作成は「循環的」ではありません。

a = [0, 1, 2]
a[2]  # 2
a[3]  # IndexError, not 0
a[-3] # 0
a[-4] # IndexError, not 2

-3インデックスは単にlength-3.

于 2013-04-26T13:15:53.863 に答える
1

range1stop パラメータから減算しません。stopそれは(終点を除いているため)以上になるまで増加(または減少 - この例では増加すると仮定しましょう)してから戻ります。空の範囲であるend point を含まないからにa[0:0]移動するように指示したため、配列全体を配信しないでください。000

于 2013-04-26T13:11:23.777 に答える
1

これは、スライスすると、正の数はリストの最初から数えられ、負の数は最後から数えられるためです。スライスすると、最初のインデックス (含む) から 2 番目のインデックス (含まない) までのすべてが取得されます。その範囲に何もない場合、空のリストが得られます。

a[0:0]

多くの人にとって非常に紛らわしい API です。python が実際に何をしているのかを考えると役立つ場合があります。

a[slice(0,None)]

これは、0 から開始することを示していますが、上限は無限であると言う Python の方法である上限はありません。したがって、すべての要素を取得します。

もちろん、これは次の方法でも実現できます。

a[:]

その場合、下限もありません...

于 2013-04-26T13:12:40.193 に答える
1

スライスs[i:j]は次のように定義されています。

  • iorが負の場合j、インデックスは文字列の末尾からの相対値になります: len(s) + iorlen(s) + jが置換されます。-0しかし、まだであることに注意してください0
  • sfrom itoのスライスは、 のようなjインデックスを持つアイテムのシーケンスとして定義されます。またはが より大きい場合は、を使用します。が省略されているか、None の場合は、 を使用します。または を省略した場合は、 を使用します。が 以上の場合、スライスは空です。ki <= k < jijlen(s)len(s)i0jNonelen(s)ij

は に等しいのでa[0:0]、空のリストが得られます。また、ネガティブはスライスが発生する前に変換されるため、それ自体は有効なスライスではありませんが (そうではないため)、変換が前に行われるため、機能します。ija[i:j]ja[i:range(a) + j]a[0:-1]i < j

于 2013-04-26T13:16:46.700 に答える
0

循環インデックスではなく、逆反復について質問しているようです。逆反復は単純で、スライスまたは を使用しますreversed()

for i in range(10)[::-1]:
    print i
for i in reversed(range(10)):
    print i

逆はかなり自明です。スライスの場合、コロンで区切られたリストの 3 番目の値がステップです。負のステップを指定すると、リストを逆方向に反復します。start または stop を指定しない場合は、リスト全体を反復処理します。

于 2013-04-26T13:12:08.527 に答える