如何在 python 中以这种方式对这个数组进行排序?

问题描述 投票:0回答:5

给你一个数组,例如:

arr = [['AB','KR','EH'],['EE','DD','PS'],['GH','LM','XK']]

array printed by rows

然后,通过一个函数,你要得到这个:

sorted array printed by rows

数组必须作为一个整体升序排序,而不仅仅是按行排序。您不能为此创建新数组。你必须到位。

我试图找到一种不使用新数组来做到这一点的方法,但我做不到。 这是我的代码,它当然对数组进行排序但创建一个新数组。

def sortArray(arr): #n : filas,columnas
    sorted_arr = []
    for j in arr:
        sorted_arr.extend(j)

    return sorted(sorted_arr)
python arrays sorting row edit-in-place
5个回答
0
投票

尝试:

from itertools import islice

arr = [["AB", "KR", "EH"], ["EE", "DD", "PS"], ["GH", "LM", "XK"]]

i = iter(sorted(v for l in arr for v in l))
for l in arr:
    l[:] = islice(i, 0, len(l))

print(arr)

印花:

[
  ["AB", "DD", "EE"], 
  ["EH", "GH", "KR"], 
  ["LM", "PS", "XK"]
]

0
投票

您可以使用从 0 到

N * N - 1
的索引执行选择排序,其中
N
是数组的长度(因为它是正方形)。每个索引在实际数组中对应的元素可以通过除法取余来计算。

def sortArray(arr):
    n = len(arr)
    for i in range(n * n):
        m = i
        for j in range(i + 1, n * n):
            if arr[j // n][j % n] < arr[m // n][m % n]:
                m = j
        arr[i // n][i % n], arr[m // n][m % n] = arr[m // n][m % n], arr[i // n][i % n]

0
投票

好吧,如果您不能创建新列表并且必须就地完成,您可以随时进行交换排序:

arr = [['AB','KR','EH'],['EE','DD','PS'],['GH','LM','XK']]

def sortedArray(arr):
    height = len(arr)
    width = len(arr[0])
    for left in range(height*width):
        for right in range(left+1, height*width):
            li, lj = left//height, left%width
            ri, rj = right//height, right%width
            if arr[li][lj] > arr[ri][rj]:
                arr[li][lj], arr[ri][rj] = arr[ri][rj], arr[li][lj]
    
    return arr

print(sortedArray(arr))

输出:

[
 ['AB', 'DD', 'EE'], 
 ['EH', 'GH', 'KR'], 
 ['LM', 'PS', 'XK']
]

看起来很乱,感觉很呆板,但至少符合要求


0
投票

(结果基于他们的评论,即与错误图像中显示的不完全一样。他们说它总是正方形。)

方案一:奇数插入排序算法

a = [['AB','KR','EH'],['EE','DD','PS'],['GH','LM','XK']]

r = range(len(a))
for i in r:
  for j in r:
    for I in r:
      for J in r:
        if a[i][j] < a[I][J]:
          a[i][j], a[I][J] = a[I][J], a[i][j]

print(a)

输出(在线尝试!):

[['AB', 'DD', 'EE'], ['EH', 'GH', 'KR'], ['LM', 'PS', 'XK']]

方案二:普通插入排序

真的很普通。只是一维插入排序。但是在转换索引并获取/设置二维原始值的对象上:

def insertionSort(A):
  for i, a in enumerate(A):
    while i and a < A[i-1]:
      A[i] = A[i-1]
      i -= 1
    A[i] = a

def sortArray(A):
  class B:
    def __getitem__(_, i):
      return A[i//n][i%n]
    def __setitem__(_, i, value):
      A[i//n][i%n] = value
  n = len(A)
  insertionSort(B())
  return A

arr = [['AB','KR','EH'],['EE','DD','PS'],['GH','LM','XK']]
print(sortArray(arr))

在线试用!


-2
投票
def sortArray(arr):
    n = len(arr)
    for i in range(n * n):
        m = i
        for j in range(i + 1, n * n):
            if arr[j // n][j % n] < arr[m // n][m % n]:
                m = j
        arr[i // n][i % n], arr[m // n][m % n] = arr[m // n][m % n], arr[i // n][i % n]
© www.soinside.com 2019 - 2024. All rights reserved.