Chandrachud Pati
Chandrachud Pati

Reputation: 575

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

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?

Upvotes: 3

Views: 4240

Answers (3)

Chris Doyle
Chris Doyle

Reputation: 11992

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

Upvotes: 2

Thierry Lathuille
Thierry Lathuille

Reputation: 24232

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

Upvotes: 2

Ali Ülkü
Ali Ülkü

Reputation: 106

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:

Upvotes: 2

Related Questions