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

别来无恙 提交于 2021-01-28 05:14:26

问题


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?


回答1:


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



回答2:


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:



回答3:


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


来源:https://stackoverflow.com/questions/65212883/how-to-reduce-the-nested-for-loop-complexity-to-a-single-loop-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!