Pythonのインデックスを使用して逆方向にループしますか?


286

100から0にループしようとしています。Pythonでこれを行うにはどうすればよいですか?

for i in range (100,0) 動作しません。


9
ところで、おそらく99から0に、まれに100から0にループする必要があります。これは回答に影響します。
Acumenus 2016

1
@Acumenusここにたどり着いたとき、私はまさにそれを探していました。そして記録のために、解決策は単に書くことです:(range(100)[::-1]自動的にに翻訳されますrange(9, -1, -1))-Python 3.7でテスト
Hassan

回答:


398

を試してくださいrange(100,-1,-1)。3番目の引数は使用する増分です(ここに記載されています)。

(「範囲」オプション、開始、停止、ステップはここに記載されています


3
また、これを使用してコレクションから項目を削除する必要があるため、インデックスが必要なのはそのためです。
Joan Venge、

2
2番目の引数は、最終値よりも1つ小さい値です。したがって、-1を指定すると、範囲は0で停止し、-5を指定すると、範囲は-4で停止します(-1の増分)
mulllhausen

200

私の意見では、これは最も読みやすいです:

for i in reversed(xrange(101)):
    print i,

14
これは、実際にメモリ内のすべての数値を割り当てるわけではないため(Python 3では、受け入れられた回答も割り当てられないため)、受け入れられた回答よりも優れています。さらに、何が起こっているかがより明確になります。
Blixt

5
Python 2.6より前のPythonでは、xrangeに逆方向に進むように指示する方法がないため、すべての数値が割り当てられます...(Python 2.6以降では、__ reversed __()を呼び出します)
Robert Siemer

私は好むreversed(xrange(len(list)))xrange(len(list)-1:-1:-1)。後者は非常に多く-1ので奇妙に見えるだけです。
musiphil 2013

1
xrange()はPython 3ではもう利用できません
Chris Graf

1
Python 3 では、2.7 rangeと同じようにxrange動作します。@hacksoiはユースケースに依存しますが、大きなバッファーで逆方向に反復しているとしましょう。10MBだとしましょう。逆のインデックスを最初に作成すると、数秒かかり、50 MB以上のメモリを消費します。反転ジェネレーターを使用すると数ミリ秒かかり、数バイトのメモリしか使いません。
Blixt

34
for i in range(100, -1, -1)

そして少し長い(そして遅い)解決策:

for i in reversed(range(101))

for i in range(101)[::-1]

16

一般にPythonでは、負のインデックスを使用して後ろから開始できます。

numbers = [10, 20, 30, 40, 50]
for i in xrange(len(numbers)):
    print numbers[-i - 1]

結果:

50
40
30
20
10

8

コードが機能しなかった理由

あなたのコードはfor i in range (100, 0)、罰金である以外

3番目のパラメーター(step)はデフォルトです+1。したがって、-1後方に進むには、range()に3番目のパラメーターを指定する必要があります。

for i in range(100, -1, -1):
    print(i)

注:これには、出力に100と0が含まれます。

複数の方法があります。

もっといい方法

Pythonの方法については、PEP 0322を確認してください。

これは、100から0(100と0を含む)までを出力するPython3 pythonicの例です。

for i in reversed(range(101)):
    print(i)

1
はい、PEP-322は、反復を逆にするための明確でエラーが発生しにくい方法を提供します。
アレンシェン

1
これはいい。reversedPEP-322での実装方法の推奨は誤解を招くため、は反復可能オブジェクトreversedを呼び出し__reversed__て結果を返します。rangeオブジェクトの場合、これは遅延評価されたrange_object反復子です。つまり、この方法を使用することは、まだ遅延評価です。
Ruzihm

5

別の解決策:

z = 10
for x in range (z):
   y = z-x
   print y

結果:

10
9
8
7
6
5
4
3
2
1

ヒント:このメソッドを使用してリスト内のインデックスを数える場合、リストのインデックスは0から始まるため、「y」の値から-1にする必要があります。


3

問題を解決する簡単な答えは次のようになります。

for i in range(100):
    k = 100 - i
    print(k)


1

短くて甘い。これは、codeAcademyコースを行うときの私の解決策でした。文字列を回転順に印刷します。

def reverse(text):
    string = ""
    for i in range(len(text)-1,-1,-1):
        string += text[i]
    return string    

1

あなたは常に増加範囲を行うと、あなたのケースで変数から差し引くことができます100 - iどこi in range( 0, 101 )

for i in range( 0, 101 ):
    print 100 - i

0

私はこれをcodeacademy演習の1つで試しました(reversed nor :: -1を使用せずに文字列のcharsを反転する)

def reverse(text):
    chars= []
    l = len(text)
    last = l-1
    for i in range (l):
        chars.append(text[last])
        last-=1

    result= ""   
    for c in chars:
        result += c
    return result
print reverse('hola')

0

2つのリストを同時に逆方向にループしたいので、負のインデックスが必要でした。これは私の解決策です:

a= [1,3,4,5,2]
for i in range(-1, -len(a), -1):
    print(i, a[i])

結果:

-1 2
-2 5
-3 4
-4 3
-5 1

0

ああ、問題を間違って読んでください。配列を逆方向に移動することだと思いますか?もしそうなら、私はこれを持っています:

array = ["ty", "rogers", "smith", "davis", "tony", "jack", "john", "jill", "harry", "tom", "jane", "hilary", "jackson", "andrew", "george", "rachel"]


counter = 0   

for loop in range(len(array)):
    if loop <= len(array):
        counter = -1
        reverseEngineering = loop + counter
        print(array[reverseEngineering])

あなたの答えはあなたが作ったテストのコピーペーストであるようです。最小限の例を投稿してみてください:の使用globaltime最初の質問には関係ありません。
Michael Doubez

-1

Pythonでカスタムリバースメカニズムを作成することもできます。これは、イテラブルを逆方向​​にループするためにどこでも使用できます

class Reverse:
    """Iterator for looping over a sequence backwards"""
    def __init__(self, seq):
        self.seq = seq
        self.index = len(seq)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index -= 1
        return self.seq[self.index]


>>> d = [1,2,3,4,5]
>>> for i in Reverse(d):
...   print(i)
... 
5
4
3
2
1

-2
a = 10
for i in sorted(range(a), reverse=True):
    print i

Stack Overflowへようこそ!投稿を編集して、コードの機能と問題を解決する理由を詳しく説明してください。通常、コードが含まれているだけの回答(たとえそれが機能していても)は、通常、OPが問題を理解するのに役立ちません。
SuperBiasedMan

を使用sortedすると、リスト全体がメモリに不必要に保存されることに気付きますよね?これは無駄であり、大規模なユーザーには適していませんa
Acumenus 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.