[英]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.