だから私はcollection[len(collection)-1]
で始まりそして終わることができcollection[0]
ます。
また、ループインデックスにアクセスできるようにしたいです。
組み込みreversed()
関数を使用します。
>>> a = ["foo", "bar", "baz"]
>>> for i in reversed(a):
... print(i)
...
baz
bar
foo
元のインデックスにもアクセスするenumerate()
には、リストに渡す前にリストで使用しますreversed()
。
>>> for i, e in reversed(list(enumerate(a))):
... print(i, e)
...
2 baz
1 bar
0 foo
enumerate()
ジェネレーターを返し、ジェネレーターを元に戻すことはできないため、最初に変換する必要がありますlist
。
できるよ:
for item in my_list[::-1]:
print item
(または for ループでやりたいことは何でも。)
スライスは[::-1]
for ループでリストを逆にします (ただし、実際にはリストを「永久に」変更するわけではありません)。
ループ インデックスが必要で、リスト全体を 2 回トラバースしたくない、または余分なメモリを使用したくない場合は、ジェネレーターを作成します。
def reverse_enum(L):
for index in reversed(xrange(len(L))):
yield index, L[index]
L = ['foo', 'bar', 'bas']
for index, item in reverse_enum(L):
print index, item
reversed
組み込み関数は便利です:
for item in reversed(sequence):
reversedのドキュメントでは、その制限について説明しています。
インデックスに沿ってシーケンスを逆にたどる必要がある場合 (たとえば、シーケンスの長さを変更するインプレース変更の場合)、この関数を my codeutil モジュールに定義します。
from six.moves import zip as izip, range as xrange
def reversed_enumerate(sequence):
return izip(
reversed(xrange(len(sequence))),
reversed(sequence),
)
これにより、シーケンスのコピーが作成されなくなります。明らかに、reversed
制限は引き続き適用されます。
インポートのないアプローチ:
for i in range(1,len(arr)+1):
print(arr[-i])
または、このアプローチはメモリ内に新しいリストを作成するため、大きなリストには注意してください
for i in arr[::-1]:
print(i)
新しいリストを再作成せずに、インデックスを作成することで次のことができます。
>>> foo = ['1a','2b','3c','4d']
>>> for i in range(len(foo)):
... print foo[-(i+1)]
...
4d
3c
2b
1a
>>>
また
>>> length = len(foo)
>>> for i in range(length):
... print foo[length-i-1]
...
4d
3c
2b
1a
>>>
Python 3 では、リストはコピーを作成するため、reversed(list(enumerate(collection))
非効率的である可能性があり、別のリストを生成しても最適化されません。
コレクションが確実にリストである場合は、イテレータの背後にある複雑さを隠すのが最善かもしれません
def reversed_enumerate(collection: list):
for i in range(len(collection)-1, -1, -1):
yield i, collection[i]
したがって、最もクリーンなのは次のとおりです。
for i, elem in reversed_enumerate(['foo', 'bar', 'baz']):
print(i, elem)
私はワンライナージェネレーターアプローチが好きです:
((i, sequence[i]) for i in reversed(xrange(len(sequence))))
使用list.reverse()
してから、通常どおりに繰り返します。
def reverse(spam):
k = []
for i in spam:
k.insert(0,i)
return "".join(k)
ここでは逆関数が役に立ちます。
myArray = [1,2,3,4]
myArray.reverse()
for x in myArray:
print x
負のインデックスを使用するには: -1 から開始し、反復ごとに -1 ずつ戻ります。
>>> a = ["foo", "bar", "baz"]
>>> for i in range(-1, -1*(len(a)+1), -1):
... print i, a[i]
...
-1 baz
-2 bar
-3 foo
while
ループを使用することもできます:
i = len(collection)-1
while i>=0:
value = collection[i]
index = i
i-=1
他の答えは良いですが、リストの理解スタイルとしてやりたい場合
collection = ['a','b','c']
[item for item in reversed( collection ) ]
input_list = ['foo','bar','baz']
for i in range(-1,-len(input_list)-1,-1)
print(input_list[i])
これも簡単な方法だと思います...最後から読み取り、リストの長さまでデクリメントし続けます。「終了」インデックスを実行しないため、-1も追加されます