我正在尝试从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数组。是否可以使用已排序的函数分别对行和列进行排序?
答案 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和更快的方法,还有更好的方法:)