912

だから私はcollection[len(collection)-1]で始まりそして終わることができcollection[0]ます。

また、ループインデックスにアクセスできるようにしたいです。

4

27 に答える 27

1526

組み込み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

于 2009-02-09T19:05:54.000 に答える
215

できるよ:

for item in my_list[::-1]:
    print item

(または for ループでやりたいことは何でも。)

スライスは[::-1]for ループでリストを逆にします (ただし、実際にはリストを「永久に」変更するわけではありません)。

于 2009-02-09T19:07:38.630 に答える
73

ループ インデックスが必要で、リスト全体を 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
于 2009-02-09T19:14:12.187 に答える
35

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制限は引き続き適用されます。

于 2011-10-11T06:28:19.650 に答える
25

インポートのないアプローチ:

for i in range(1,len(arr)+1):
    print(arr[-i])

または、このアプローチはメモリ内に新しいリストを作成するため、大きなリストには注意してください

for i in arr[::-1]:
    print(i)
于 2016-12-06T15:37:37.547 に答える
11

新しいリストを再作成せずに、インデックスを作成することで次のことができます。

>>> 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
>>>
于 2014-02-15T05:04:53.750 に答える
11

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)
于 2018-07-14T14:58:32.967 に答える
9

私はワンライナージェネレーターアプローチが好きです:

((i, sequence[i]) for i in reversed(xrange(len(sequence))))
于 2014-08-17T18:50:25.510 に答える
5

使用list.reverse()してから、通常どおりに繰り返します。

http://docs.python.org/tutorial/datastructures.html

于 2009-02-09T19:07:13.530 に答える
4
def reverse(spam):
    k = []
    for i in spam:
        k.insert(0,i)
    return "".join(k)
于 2014-04-25T01:02:02.093 に答える
2

ここでは逆関数が役に立ちます。

myArray = [1,2,3,4]
myArray.reverse()
for x in myArray:
    print x
于 2009-02-09T19:07:30.470 に答える
1

負のインデックスを使用するには: -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
于 2016-06-01T17:04:02.843 に答える
1

whileループを使用することもできます:

i = len(collection)-1
while i>=0:
    value = collection[i]
    index = i
    i-=1
于 2016-07-27T12:57:10.533 に答える
0

他の答えは良いですが、リストの理解スタイルとしてやりたい場合

collection = ['a','b','c']
[item for item in reversed( collection ) ]
于 2013-07-27T15:17:43.157 に答える
0
input_list = ['foo','bar','baz']
for i in range(-1,-len(input_list)-1,-1)
    print(input_list[i])

これも簡単な方法だと思います...最後から読み取り、リストの長さまでデクリメントし続けます。「終了」インデックスを実行しないため、-1も追加されます

于 2018-07-22T07:09:28.223 に答える