Pythonでforループを減らすことは不可能ですか?


93

私は間違っている可能性があります(知らせて質問を削除します)が、pythonが応答しないようです

for n in range(6,0):
    print n

xrangeを使ってみましたが、うまくいきませんでした。どうすれば実装できますか?


好奇心から、これを何かに使用していますか?この機能が必要になることはかなりまれです。
Katriel 2010年

@katrielalexマトリックスを右から左に反復するために使用します。私がやるべきことを提案する別の方法はありますか?
ギャル

for i in reversed(mat):遅いかもしれませんが、試すことができます
Katriel

範囲逆の順序でリスト印刷するをご覧ください。その他の役立つ情報が提供されています。
RF

1
見てください範囲逆の順序でリスト印刷してください、受け入れられた答えはそれを非常に明確に説明しています。
RF

回答:


214
for n in range(6,0,-1):
    print n
# prints [6, 5, 4, 3, 2, 1]

20
実はベッチャOPが欲しかったrange(5,-1,-1)。彼はおそらく試行錯誤からそれを理解することができましたが。
小次郎2013

42

これは非常に遅いですが、私はもっとエレガントな方法があることを付け加えたかっただけです: reversed

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

与える:

4
3
2
1
0

1
その上品なところは何ですか?リストを思い通りに生成するのではなく、リストを反転させることに時間を費やしています。
アレクシス2012年

5
@alexis費用はかかりません。CPythonに組み込まれreversed(range)た優れたrange_reverse最適化により、無料で入手できます。私はいくつかの簡単なベンチマークを実行しましたが、Python 2.7と3.3の両方で、step=-1およびreversed()Python 2.7と3.3の間に大きなコストの違いを見つけることができませんでした。また、このイディオムはheapqでも使用されていることに注意してください。
kojiro 2013

@kojiroさん、ありがとうございます。ただしxrange、Python 2.7テストで使用しない限り、reverseは範囲オブジェクトではなく、通常の既に生成されたリストで動作します。あなたが言っているすべてのリストを効率的に反転させることができ、または単にrange/xrangeオブジェクト?(リンク先のheapqコードにはPython 3範囲オブジェクトが含まれます)。
アレクシス2013

@alexis私はどんなリストも効率的に逆転できることを示唆するほど大胆ではないでしょう–それは私がとにかく答えるには余りにも修飾されていないステートメントです。heapifyコードから変更されたこと、しかし、言っていますstep=-1reversed()Pythonの間で2.3および2.4
小次郎

1
reversed(range(10))4介して出力できない可能性があります0。たぶん、あなたは意味しましたrange(5)か?
Abhijit Sarkar

12
for n in range(6,0,-1)

これはあなたに与えるでしょう 6,5,4,3,2,1

はどうかと言うと

for n in reversed(range(0,6))

あなたに与えるだろう 5,4,3,2,1,0




2

この条件が真の場合、0は条件値であり、ループは実行を継続します。10は初期値です。1は修飾子であり、単純な減分になる場合があります。

for number in reversed(range(0,10,1)):
print number;

1

パーティーには遅れますが、自分で作成する必要がある場合や、これがどのように機能するかを確認したい場合のために、目的の増分に基づいてスタート/ストップ値を再調整する追加のボーナスを備えた関数を次に示します。

def RANGE(start, stop=None, increment=1):
    if stop is None:
        stop = start
        start = 1

    value_list = sorted([start, stop])

    if increment == 0:
        print('Error! Please enter nonzero increment value!')
    else:
        value_list = sorted([start, stop])
        if increment < 0:
            start = value_list[1]
            stop = value_list[0]
            while start >= stop:
                worker = start
                start += increment
                yield worker
        else:
            start = value_list[0]
            stop = value_list[1]
            while start < stop:
                worker = start
                start += increment
                yield worker

負の増分:

for i in RANGE(1, 10, -1):
    print(i)

または、スタート/ストップを逆にして:

for i in RANGE(10, 1, -1):
    print(i)

出力:

10
9
8
7
6
5
4
3
2
1

通常の増分:

for i in RANGE(1, 10):
    print(i)

出力:

1
2
3
4
5
6
7
8
9

ゼロ増分:

for i in RANGE(1, 10, 0):
    print(i)

出力:

'Error! Please enter nonzero increment value!'

0

python3の場合-1、各ステップでデクリメントされる値を示します for n in range(6,0,-1): print(n)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.