搜索二维数组中的数字

时间:2019-02-07 04:45:57

标签: python python-3.x sorting search 2d

我正在尝试从2D数组列表中查找所需的数字。但是,在搜索之前必须先对其进行排序。

当我尝试在2D数组中查找数字时,一切似乎都正常运行。仅仅是以仍然可以使用的方式对2D数组进行排序的事实。假设我要对3x3 2D数组进行排序。它应显示的方式是:

    [[8, 27, 6],
     [1, 0, 11],
     [10, 9, 3]]

然后,我将使用通过排序的2D数组的二进制搜索方法来查找数字。我的中间值将位于搜索数组的中间。

这只是一个示例,但是当我输入随机数然后对行和列进行排序时,我想要完成的任务。根据这个想法,我使用了Python的random.randint()库来随机分配我的数字。然后,我试图在2d数组中进行排序,但是在继续之前并不是真正的排序。

n = 5
m = 5

def findnum_arr(array, num):
    low = 0
    high = n * m - 1
    while (high >= low):
        mid = (low + high) // 2
        i = mid // m
        j = mid % m

        if (num == array[i][j]):
            return True
        if (num < array[i][j]):
            high = mid - 1
        else:
            low = mid + 1
    return False

if __name__ == '__main__':
    multi_array = [[random.randint(0, 20) for x in range(n)] for y in range(m)]
    sorted(multi_array)

排序:

    [[0, 1, 3],
     [6, 8, 9],
     [10, 11, 27]]

应该是排序的2D数组。是否可以使用已排序的函数分别对行和列进行排序?

2 个答案:

答案 0 :(得分:1)

调用是在嵌套列表上进行排序的,该嵌套列表将根据列表中的第一个索引进行排序。

示例:

arr = [[8, 27, 6],[1, 0, 11],[10, 15, 3], [16, 12, 14], [4, 9, 13]]

将要返回

[[1, 0, 11], [4, 9, 13], [8, 27, 6], [10, 15, 3], [16, 12, 14]]

要按照您想要的方式进行操作,您将不得不展平然后重新塑形。

为此,我将尝试引入numpy。

import numpy as np


a = np.array(sorted(sum(arr, [])))

#sorted(sum(arr, [])) flattens the list

b = np.reshape(a, (-1,3)).tolist()

为清晰起见而编辑:您可以将m和n用作np.reshape中的参数。第一个参数(m)将返回数组数,而(n)将返回数组数。

在任何一个参数中使用-1意味着调整后的数组将适合返回另一个参数的要求。

b将返回

[[0, 1, 3], [4, 6, 8], [9, 10, 11], [12, 13, 14], [15, 16, 27]]

答案 1 :(得分:0)

最后找到了不使用numpy并避免使用y模块的合适解决方案。

sum()

输出:

if __name__ == '__main__':
    x = 7
    multi_array = [[random.randint(0, 200) for x in range(n)] for y in range(m)]
    # one_array = sorted(list(itertools.chain.from_iterable(multi_array))) Another way if you are using itertools
    one_array = sorted([x for row in multi_array for x in row])
    sorted_2d = [one_array[i:i+m] for i in range(0, len(one_array), n)]

    print("multi_array list is: \n{0}\n".format(multi_array))
    print("sorted 2D array: \n{0}\n".format(sorted_2d))
    if not findnum_arr(sorted_2d, x):
        print("Not Found")
    else:
        print("Found")

我想找到一个标准的库模块,在其中可以将2D数组平整为1D并对其进行排序。然后,我将对我的1D数组进行列表理解并将其构建为2D数组。这听起来很奏效,但似乎效果很好。让我知道如果没有numpy和更快的方法,还有更好的方法:)