簡體   English   中英

通過對角填充元素將列表轉換為矩陣

[英]Converting a list into a matrix by diagonally filling up the elements

我有一個sorted list ,如下所示:

mylist = [-2, -2, 1, 1, 4, 4, 3, 3, 3]

該列表根據其出現的次數按升序排序。 在平局的情況下,列表將根據值進行排序。

我需要將此列表轉換square matrix of equal chunks(3*3 in this case) ,以便數字"diagonally" starting from the bottom right corner放置。

一般情況是將列表分成相等的塊。

所需的 Output:

res = [[3, 3, 4],
      [3, 4, 1],
      [1, -2, -2]]

我已經編寫了以下代碼,但仍然無法獲得所需的 output:

def create_matrix(lst, n):
    for i in range(0, len(lst), n):
        print(i)
        yield lst[i: i+n]

m = create_matrix(mylist, 3)

print(list(m))

一種解決方案可能是將對放在隊列/堆棧中,然后根據需要彈出。

我假設您想以這種方式迭代 output 矩陣(NxN = 5x5 示例,0->24 順序):

[[ 0,  1,  3,  6, 10],
 [ 2,  4,  7, 11, 15],
 [ 5,  8, 12, 16, 19],
 [ 9, 13, 17, 20, 22],
 [14, 18, 21, 23, 24]]

對於每個單元格,坐標 (i,j) 的總和等於從左上角到右下角的對角線 ( k ) 的數量(總共 2*N-1 條對角線)

對於 N 個第一個對角線,第一項具有i=0 ,以下是i=kN ,其中k是對角線數。

最后一項具有i=k ,最大值為N

j = ki

這為我們提供了以下算法來按順序迭代單元格:

import math

mylist = [-2, -2, 1, 1, 4, 4, 3, 3, 3]

N = int(math.sqrt(len(mylist))) # 3

out = [[None for _ in range(N)]
       for _ in range(N)]

r = reversed(mylist)

for k in range(2*N-1):
    start = 0 if k<N else k-N+1
    stop = min(k, N-1)
    for i in range(start, stop+1):
        out[i][k-i] = next(r)

print(out)

Output:

[[3, 3, 4],
 [3, 4, 1],
 [1, -2, -2]]

這是一些將列表向后包裝到矩陣的代碼,這似乎解決了這種情況。 另外,你的問題沒有任何意義。 對角線? 該列表是如何排序的?

def create_matrix(lst, n):
    ret = [[0 for i in range(n)] for i in range(n)]
    for i in range(n*n-1,-1,-1):
        ret[i//n][i%n] = lst[n*n-1-i]
    return ret

編輯:那是行不通的。 我想沒有人知道你所說的對角線是什么意思。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM