1

次のコードを検討してください。

>>> a = [0, 1, 2]
>>> for i in range(len(a)):
>>>   print a[0:i]

[]
[0]
[0, 1]

ただし、コードを反転してリストの反対側からスライスを取得すると、機能しなくなります。

>>> for i in range(len(a)):
>>>   print a[-i:]

[0, 1, 2]
[2]
[1, 2]

コードの 2 番目の部分を機能させる唯一の方法は、リストを逆にし、最初の方法で実行し、印刷する前に各部分を逆にすることです。これを行うより良い方法はありますか?私はこのタイプのループを時々使用しますが、コードをできるだけクリーンにしたいと考えています。

編集:両方のループで、左から右に繰り返しています。2 番目のループでも反復の方向を反転すると、機能します。最初のループの反復の方向を反転すると、2 番目のループと同じ問題が発生します。

>>> for i in range(len(a)):
>>>   print a[i-1::-1]

[2, 1, 0]
[0]
[1, 0]
4

2 に答える 2

8

最初の反復では、 としてスライスしています。-0これは、 からスライスするのとまったく同じ0です。-12 番目の反復のみが、次にとしてスライスされます-2

おそらく、負のインデックスから始まる範囲を使用できます。

for i in range(-len(a), 0):
    print a[-i:]
于 2013-03-23T23:03:19.457 に答える
0

逆スライスは、0ベースのインデックス付けのため、Pythonでは完全に対称にすることはできません。具体的には、-0と0を区別することはできません。ただし、0ベースのインデックス付き配列の対称アクセスのユースケースでは、0番目の項目が左から最初の場合、-0番目の項目(つまり、負の0)は右から1番目ですが、0と-0は同じエンティティであるため、これは問題を引き起こします。

リストのインデックスの2つの方向を考えてみましょう。

転送:最初のアイテムは位置0にあり、2番目のアイテムは位置1にあり、...、最後のアイテムは位置n-1にあります

後方:最初のアイテムは位置-1にあり、2番目は-2にあり、...、最後のアイテムは位置-nにあります

したがって、負のインデックス表記は(length-index)の省略形です。collection[-i] == collection[len(collection) - i]

または、並べて、インデックス付けは次のようになります。

[0, 1, 2,...,n-1]
[-n,..., -3, -2, -1 ]

上記の両方のインデックスが実際に同一である場合。

対称操作を実行するには、スライス演算子がこのインデックススキームを正しく考慮する必要があります。

元のスライスa[0:i]==ステップサイズ1の左端(0)からのi要素==a[0:i:1]

逆スライス:ステップサイズが-1の右端(-1)からのi要素。

したがって、もう一方の端からの正しいスライスは次のようになります。a[-1:-1-i:-1]

ここでの停止値はiの負の値であり、-1ベースの逆インデックスを説明するために-1でオフセットされていることに注意してください。これは、順方向ベースのリスト(範囲関数など)を使用してiを生成するときに必要です。

a = range(3) # [0,1,2]
for i in range(len(a)):
    # forward case, next to backward case
    print a[:i], a[-1:-1-i:-1]
# [] []
# [0] [2]
# [0, 1] [2, 1]
于 2013-03-24T00:14:23.183 に答える