我在python 3中编写了这个代码,用于输入矩阵:
matrix = []
loop = True
while loop:
line = input()
if not line:
loop = False
values = line.split()
row = [int(value) for value in values]
matrix.append(row)
这将产生如下矩阵:
9 2 6 3
0 3 4 2
2 1 1 0
我的问题是;我怎样才能通过像shellort这样的排序算法对所有列进行排序:
inc = len(thelist) // 2
while inc:
for i, el in enumerate(thelist):
while i >= inc and thelist[i - inc] > el:
thelist[i] = thelist[i - inc]
i -= inc
thelist[i] = el
inc = 1 if inc == 2 else int(inc * 5.0 / 11)
它会产生排序矩阵:
0 1 1 0
2 2 4 2
9 3 6 3
到目前为止,我尝试拆分列
col = line.split(line, ',')
但它不起作用。我想在没有外部库的情况下这样做,例如numpy或其他。
由于
答案 0 :(得分:0)
使用以下代码:
def sortmatrix(matrix):
length, width = len(matrix[0]), len(matrix)
dup = [item for sub in matrix for item in sub]
dup = sorted(dup)
i = 0
new_list = [dup[i:i+length] for i in range(len(dup)) if i %length == 0]
return new_list
此代码运行:
>>> def sortmatrix(matrix):
... length, width = len(matrix[0]), len(matrix)
... dup = [item for sub in matrix for item in sub]
... dup = sorted(dup)
... i = 0
... new_list = [dup[i:i+length] for i in range(len(dup)) if i %length == 0]
... return new_list
... ...
>>> sortmatrix([['9', '2', '6', '3'], ['0', '3', '4', '2'], ['2', '1', '1', '0']])
[['0', '0', '1', '1'], ['2', '2', '2', '3'], ['3', '4', '6', '9']]
>>>
答案 1 :(得分:0)
不幸的是,python使按列排序列表非常困难(numpy数组使这更容易)。假设您不想/不能使用它们,您可以对矩阵进行转置,对生成的行进行排序,然后应用第二个转置。
sort_func是你定义的任何排序函数(我刚刚使用了排序)
如,
>>> a = [[1,3,5],[0,9,5],[2,1,5]]
>>> at = [[row[i] for row in a] for i in range(len(a))]
>>> ats = [sort_func(row) for row in at]
>>> atst = [[row[i] for row in ats] for i in range(len(ats))]
>>> atst
[[0, 1, 5], [1, 3, 5], [2, 9, 5]]
>>> a
[[1, 3, 5], [0, 9, 5], [2, 1, 5]]
如果numpy数组对你来说不是问题,我会说做类似以下的事情:
a = np.array(a)
for j in range(a.shape[1]):
a[:,j] = sort_func(a[:,j])
答案 2 :(得分:0)
您可以使用以下代码转置矩阵:
def transpose(matrix):
return map(list, zip(*matrix))
因此,如果您有一个按行排序矩阵的代码,那么您的排序可以对列进行排序(我在这里使用了内置的sorted
函数):
transpose(sorted(transpose(matrix))
如果要独立对每个列的元素进行排序,只需对列进行排序
即可transpose(map(sorted, transpose(matrix)))