在2D列表中选择所有非空子矩形

时间:2019-03-29 05:47:28

标签: python list sublist

任务:在2D列表中打印所有非空子矩形,时间限制为1秒。

我在python中尝试过。但是,我无法提高效率。执行花费了超过一秒钟的时间。

import time
start_time = time.time()
a = [[1,2,3],[4,5,6],[7,8,9]]
x = 3
y = 3
for i in range(x):
    a.append(list(map(int,input().split())))
total = []
for h in range(1,x+1):
    for k in range(1,y+1):
        temp = []
        for p in range(x):
            for d in range(y):
                for i in range(p,h):
                    for j in range(d,k):
                        temp.append(a[i][j])
                if len(temp)==0:
                    pass
                else:
                    total.append(temp)
                    temp = []
 print(total)
 print("--- %s seconds ---" % (time.time() - start_time))

代码执行不应超过一秒钟。还有其他方法可以减少循环以减少执行时间吗?

1 个答案:

答案 0 :(得分:0)

您正在请求用户输入,并且正在计时收集该输入。因此,时间是没有意义的……用户可以花费任意时间输入数据。你为什么要计时呢?您需要让用户在1秒内输入3个数字吗?

此外,从不使用输入的数据。它被附加到数组“ a”上,但是在计算中仅使用该数组中的前三个条目(在添加输入之前就存在)。因此,您最好将这两行代码从代码中收集用户输入。如果这样做,您将得到:

import time
start_time = time.time()
a = [[1,2,3],[4,5,6],[7,8,9]]
x = 3
y = 3
total = []
for h in range(1,x+1):
    for k in range(1,y+1):
        temp = []
        for p in range(x):
            for d in range(y):
                for i in range(p,h):
                    for j in range(d,k):
                        temp.append(a[i][j])
                if len(temp)==0:
                    pass
                else:
                    total.append(temp)
                    temp = []
print(total)
print("--- %s seconds ---" % (time.time() - start_time))

运行此命令的结果是:

[[1], [1, 2], [2], [1, 2, 3], [2, 3], [3], [1, 4], [4], [1, 2, 4, 5], [2, 5], [4, 5], [5], [1, 2, 3, 4, 5, 6], [2, 3, 5, 6], [3, 6], [4, 5, 6], [5, 6], [6], [1, 4, 7], [4, 7], [7], [1, 2, 4, 5, 7, 8], [2, 5, 8], [4, 5, 7, 8], [5, 8], [7, 8], [8], [1, 2, 3, 4, 5, 6, 7, 8, 9], [2, 3, 5, 6, 8, 9], [3, 6, 9], [4, 5, 6, 7, 8, 9], [5, 6, 8, 9], [6, 9], [7, 8, 9], [8, 9], [9]]
--- 0.00019288063049316406 seconds ---

大约是毫秒的1/5

也许您的计算机比我的计算机慢?要花1秒钟才能运行,它必须慢5000倍以上。

如果即使您不执行任何操作也要从用户那里获取输入,请在用户输入数据后对开始时间进行采样。