Re: [問題] 請問二維list一維化

作者: apua (Apua)   2014-09-12 21:36:54
※ 引述《ee55244 (阿一)》之銘言:
: 我手邊有一些資料分別是3*3 ~ 13*13不等的二維方陣
: 我需要以方陣中心為起點,找到周圍最大值後以順時針方向將該方陣轉為一維的list,
: 例如下列5*5方陣
: 1 2 3 4 5
: 6 7 8 9 10
: 11 12 13 14 15
: 16 17 18 19 20
: 21 22 23 24 25
: 要轉成13 19 18 17 12 7 8 9 14 20 25 24 23 22 21 16 11 6 1 2 3 4 5 10 15
對這題目有點興趣, 但原題敘述有點模糊.
反正是練習, 就改題目寫寫看.
以下是每層都找最大值為開頭, 有重複就隨意.
.. 題外話, 變數不知道取啥好, 所以就亂寫了~
.. code:: python
"""
>>> M = [[1,2,3,4,5],
... [6,7,8,9,0],
... [1,2,3,4,5],
... [6,7,8,9,0],
... [1,2,3,4,5]]
>>> print (f(M))
[3, 9, 4, 9, 8, 7, 2, 7, 8, 6, 1, 6, 1, 2, 3, 4, 5, 0, 5, 0, 5, 4, 3, 2, 1]
"""
def f(M):
if len(M)==1:
return M[0]
else:
L = M[0] + [row[-1] for row in M[1:-1]] + \
M[-1][::-1] + [row[0] for row in M[-2:0:-1]]
head = L.index(max(L))
return f([row[1:-1] for row in M[1:-1]]) + \
L[head:] + L[:head]
原題以由內往外數第二層的最大值為起點, 但未敘述與下一層起點的關係.
從範例看來, 下一圈的起點可能是與上一圈 "平行" 的點, 但這會有含糊的地方:
範例中, 上一圈的起點為 B, 下一圈的起點為 D::
[ _ , _ , _ , _ , _ ]
[ _ , _ , _ , _ , _ ]
[ _ , _ , A , C , _ ]
[ _ , _ , _ , B , D ]
[ _ , _ , _ , _ , _ ]
但在以下例子, 下一圈的起點就分不出是誰::
[ _ , _ , _ , _ , _ ]
[ _ , _ , _ , _ , _ ]
[ _ , _ , A , _ , _ ]
[ _ , _ , B , C , _ ]
[ _ , _ , ? , ? , ? ]
我想乾脆改成, 第一圈確定了起點, 就從矩陣中心往外過第一圈起點延伸, 決定外圈起點::
[ _ , _ , _ , _ , D']
[ _ , _ , _ , B', _ ]
[ D", B", A , _ , _ ]
[ _ , _ , B , _ , _ ]
[ _ , _ , D , _ , _ ]
.. code:: python
"""
>>> M = [[1,2,3,4,5],
... [6,7,8,9,0],
... [1,2,3,4,5],
... [6,7,8,9,0],
... [1,2,3,4,5]]
>>> print (g(M))
[3, 9, 4, 9, 8, 7, 2, 7, 8, 5, 0, 5, 0, 5, 4, 3, 2, 1, 6, 1, 6, 1, 2, 3, 4]
"""
def g(M):
def h(M):
L = M[0] + [row[-1] for row in M[1:-1]] + \
M[-1][::-1] + [row[0] for row in M[-2:0:-1]]
if len(M)==3:
head = L.index(max(L))
return [M[1][1]] + L[head:] + L[:head] , head
else:
_L , _head = h([row[1:-1] for row in M[1:-1]])
head = len(M)//2 * _head
return _L + L[head:] + L[:head] , _head
return M[0] if len(M)==1 else h(M)[0]

Links booklink

Contact Us: admin [ a t ] ucptt.com