Joan Venge
Joan Venge

Reputation: 330852

Loop backwards using indices

I am trying to loop from 100 to 0. How do I do this in Python?

for i in range (100,0) doesn't work.


For discussion of why range works the way it does, see Why are slice and range upper-bound exclusive?.

Upvotes: 396

Views: 547556

Answers (18)

Kenan Banks
Kenan Banks

Reputation: 211924

In my opinion, this is the most readable:

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

Upvotes: 256

TenSzalik
TenSzalik

Reputation: 41

Generally reversed() and [::-1] are the simplest options for existing lists. I did found this:

For a comparatively large list, under time constraints, it seems that the reversed() function performs faster than the slicing method. This is because reversed() just returns an iterator that iterates the original list in reverse order, without copying anything whereas slicing creates an entirely new list, copying every element from the original list. For a list with 10^6 Values, the reversed() performs almost 20,000 better than the slicing method. If there is a need to store the reverse copy of data then slicing can be used but if one only wants to iterate the list in reverse manner, reversed() is definitely the better option.

source: https://www.geeksforgeeks.org/python-reversed-vs-1-which-one-is-faster/

But my experiments do not confirm this:

For 10^5

$ python3 -m timeit -n 1000 -v "[x for x in range(100_000)[::-1]]"
raw times: 2.63 sec, 2.52 sec, 2.53 sec, 2.53 sec, 2.52 sec

1000 loops, best of 5: 2.52 msec per loop

$ python3 -m timeit -n 1000 -v "[x for x in reversed(range(100_000))]"
raw times: 2.64 sec, 2.52 sec, 2.52 sec, 2.52 sec, 2.51 sec

1000 loops, best of 5: 2.51 msec per loop

For 10^6

$ python3 -m timeit -n 1000 -v "[x for x in range(1_000_000)[::-1]]"
raw times: 31.9 sec, 31.8 sec, 31.9 sec, 32 sec, 32 sec

1000 loops, best of 5: 31.8 msec per loop

$ python3 -m timeit -n 1000 -v "[x for x in reversed(range(1_000_000))]"
raw times: 32.5 sec, 32 sec, 32.3 sec, 32 sec, 31.6 sec

1000 loops, best of 5: 31.6 msec per loop

Did I miss something?

But if you just wanna generate reversed list, there is no difference between reversed(range()) and range(n, -1, -1).

Upvotes: 0

Adnan Alaref
Adnan Alaref

Reputation: 9

It works well with me

for i in range(5)[::-1]:
    print(i,end=' ')

output : 4 3 2 1 0

Upvotes: -1

Adhrit
Adhrit

Reputation: 77

You might want to use the reversed function in python. Before we jump in to the code we must remember that the range function always returns a list (or a tuple I don't know) so range(5) will return [0, 1, 2, 3, 4]. The reversed function reverses a list or a tuple so reversed(range(5)) will be [4, 3, 2, 1, 0] so your solution might be:

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

Upvotes: 4

mohammed wazeem
mohammed wazeem

Reputation: 1328

You can also create a custom reverse mechanism in python. Which can be use anywhere for looping an iterable backwards

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

Upvotes: 1

0x6adb015
0x6adb015

Reputation: 7801

Try range(100,-1,-1), the 3rd argument being the increment to use (documented here).

("range" options, start, stop, step are documented here)

Upvotes: 566

darrell
darrell

Reputation: 63

Oh okay read the question wrong, I guess it's about going backward in an array? if so, I have this:

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])

Upvotes: 0

enoted
enoted

Reputation: 616

The simple answer to solve your problem could be like this:

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

Upvotes: 4

Emanuel Lindstr&#246;m
Emanuel Lindstr&#246;m

Reputation: 2059

I wanted to loop through a two lists backwards at the same time so I needed the negative index. This is my solution:

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

Result:

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

Upvotes: 1

pnoob
pnoob

Reputation: 19

You can always do increasing range and subtract from a variable in your case 100 - i where i in range( 0, 101 ).

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

Upvotes: 1

mythicalcoder
mythicalcoder

Reputation: 3281

Why your code didn't work

You code for i in range (100, 0) is fine, except

the third parameter (step) is by default +1. So you have to specify 3rd parameter to range() as -1 to step backwards.

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

NOTE: This includes 100 & 0 in the output.

There are multiple ways.

Better Way

For pythonic way, check PEP 0322.

This is Python3 pythonic example to print from 100 to 0 (including 100 & 0).

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

Upvotes: 20

boomba
boomba

Reputation: 68

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

Upvotes: -2

user4913463
user4913463

Reputation:

Short and sweet. This was my solution when doing codeAcademy course. Prints a string in rev order.

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

Upvotes: 1

Tabula Rasa
Tabula Rasa

Reputation: 1

I tried this in one of the codeacademy exercises (reversing chars in a string without using reversed nor :: -1)

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')

Upvotes: 0

user2220115
user2220115

Reputation: 263

for var in range(10,-1,-1) works

Upvotes: 1

Andy T.
Andy T.

Reputation: 61

Another solution:

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

Result:

10
9
8
7
6
5
4
3
2
1

Tip: If you are using this method to count back indices in a list, you will want to -1 from the 'y' value, as your list indices will begin at 0.

Upvotes: 6

Blixt
Blixt

Reputation: 50149

Generally in Python, you can use negative indices to start from the back:

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

Result:

50
40
30
20
10

Upvotes: 19

kcwu
kcwu

Reputation: 7011

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

and some slightly longer (and slower) solution:

for i in reversed(range(101))

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

Upvotes: 50

Related Questions