代碼應該制作原始陣列的副本并旋轉它(將列變成行),同時保持原始陣列相同,但原始陣列無緣無故地更改。
這很可能是一個深拷貝問題,但我已經嘗試使用copy.copy()它并沒有奏效
代碼:
l = [[1,2,3],[4,5,6],[7,8,9]]
def rotate(funcl):
funcl = funcl[::-1]
for s1 in range(0, len(funcl)):
for s2 in range(s1, len(funcl)):
funcl[s1][s2], funcl[s2][s1] = funcl[s2][s1], funcl[s1][s2]
return funcl
print("Original Array:\n", l)
nextl = rotate(l)
print("Original Array after Function:\n", l)
print("New Rotated Array:\n", nextl)
輸出:
Original Array:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Original Array after Function:
[[9, 6, 3], [8, 5, 2], [7, 4, 1]]
New Rotated Array:
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
如您所見,該函式運行良好,但更改了原始陣列
uj5u.com熱心網友回復:
一種方法是在將其傳遞給函式之前使用 copy.deepcopy() 進行深度復制,以便復制串列的每個級別和嵌套子級別:
import copy
l = [[1,2,3],[4,5,6],[7,8,9]]
def rotate(funcl):
funcl = funcl[::-1]
for s1 in range(0, len(funcl)):
for s2 in range(s1, len(funcl)):
funcl[s1][s2], funcl[s2][s1] = funcl[s2][s1], funcl[s1][s2]
return funcl
print("Original Array:\n", l)
nextl = rotate(copy.deepcopy(l))
print("Original Array after Function:\n", l)
print("New Rotated Array:\n", nextl)
輸出是:
Original Array:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Original Array after Function:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
New Rotated Array:
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
uj5u.com熱心網友回復:
deepcopy 眾所周知,速度很慢,如果可以,應該避免。
zip()經常用于在python中轉置串列。這里唯一的問題是你想扭轉它們。你可以使用reversed()它并得到一個非常簡潔的:
l = [[1,2,3],[4,5,6],[7,8,9]]
def rotate(funcl):
return list(zip(*reversed(funcl)))
print("Original Array:\n", l)
nextl = rotate(l)
print("Original Array after Function:\n", l)
print("New Rotated Array:\n", nextl)
哪個列印:
Original Array:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Original Array after Function:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
New Rotated Array:
[(7, 4, 1), (8, 5, 2), (9, 6, 3)]
如果維護內部串列而不是元組很重要,您可以添加一個映射來混合:
l = [[1,2,3],[4,5,6],[7,8,9]]
def rotate(funcl):
return list(map(list, zip(*reversed(funcl))))
# or return [list(t) for t in zip(*reversed(funcl))]
rotate(l)
# [[7, 4, 1], [8, 5, 2], [9, 6, 3]]
uj5u.com熱心網友回復:
這是一個有效的版本(加上一種更好的方式來列印這些串列):
def printlst(arr):
for row in arr:
print(*row)
def rotate(funcl):
newl = [row.copy() for row in funcl]
newl = newl[::-1]
for s1 in range(0, len(newl)):
for s2 in range(s1, len(newl)):
newl[s1][s2], newl[s2][s1] = newl[s2][s1], newl[s1][s2]
return newl
l = [[1,2,3],[4,5,6],[7,8,9]]
print("Original Array:")
printlst(l)
nextl = rotate(l)
print("Original Array after Function:")
printlst(l)
print("New Rotated Array:")
printlst(nextl)
結果輸出:
Original Array:
1 2 3
4 5 6
7 8 9
Original Array after Function:
1 2 3
4 5 6
7 8 9
New Rotated Array:
7 4 1
8 5 2
9 6 3
另一種方法:
def rotate(funcl):
return [[funcl[j][i] for j in range(len(funcl))[::-1]] for i in range(len(funcl))]
uj5u.com熱心網友回復:
這確實是一個深拷貝問題:funcl = funcl[::-1]只做淺拷貝。
無論如何,Pythonic 的方法是使用雙串列理解直接構建轉置陣列,避免復制后跟旋轉:
def rotate(funcl):
return [[funcl[j][i] for j in range(len(funcl))] for i in range(len(funcl))]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/403715.html
標籤:
上一篇:如何僅從字典中提取選定的值?
下一篇:我如何讓這兩段代碼一起運行?
