How to reduce the nested for Loop complexity to a single loop in python?

Viewed 1783
for i in range(0,x):
        for j in range(0,y):
            if (i+j)%2 == 0:

Think of something like tossing two dices at the same time and finding if the sum on the dices is an even number but here's the catch, a dice has 6 sides but here the two can have any number of sizes, equal and not equal even! Can anyone suggest how to merge it under one loop because I can't think of any?

3 Answers

based on Python combine two for loops, you can merge two for loops in a single line by importing itertools as below:

import itertools

for i, j in itertools.product(range(0,x), range(0,y)):
    if (i+j)%2 == 0:

You can't get rid of the nested loop (you could hide it, like by using itertool.product, but it would still be executed somewhere, and the complexity would still be O(x * y)) but you can get rid of the condition, if you only need to generate the values of j that satisfy it, by adapting the range for j.

This way, you'll have about twice as less loops by avoiding the useless ones.

for i in range(0,x):
    for j in range(i%2,y, 2):
        print(i, j, i+j)

Output:

0 0 0
0 2 2
1 1 2
1 3 4
2 0 2
2 2 4

For me its much cleaner to leave it as two loops. Its much more readable and easier to understand whats happening. However you could essentially do x * y then use divmod to calculate i and j

x = 2
y = 3
for i in range(0,x):
        for j in range(0,y):
            print(i, j, i+j)

print("###")
for r in range(x*y):
    i, j = divmod(r, y)
    print(i, j, i + j)

OUTPUT

0 0 0
0 1 1
0 2 2
1 0 1
1 1 2
1 2 3
###
0 0 0
0 1 1
0 2 2
1 0 1
1 1 2
1 2 3
Related