# Thử và KHÔNG THÀNH CÔNG để tạo danh sách 2d có kích thước thay đổi rows = 3 cols = 2 a = [ [0] * cols ] * rows # Lỗi. tạo bản sao nông # Tạo một hàng duy nhất, phần còn lại là bí danh. print["Điều này CÓ vẻ ổn. lúc đầu. "] print[" a =", a] a[0][0] = 42 print["Nhưng hãy xem điều gì xảy ra sau a[0][0]=42"] print[" a =", a]
# Tạo danh sách 2d có kích thước thay đổi rows = 3 cols = 2 a = [] for row in range[ rows]. a += [[0]*cols] print["Cái này ổn. lúc đầu. "] print[" a =", a] a[0][0] = 42 print["Và bây giờ hãy xem điều gì xảy ra sau a[0][0]=42"] print[" a =", a]
rows = 3 cols = 2 #Đây là cái được gọi là "hiểu danh sách" a = [ [[0] * cols] cho hàng trong phạm vi[hàng] ] print["Đây LÀ OK. lúc đầu. "] print[" a =", a] a[0][0] = 42 print["Và bây giờ hãy xem điều gì xảy ra sau a[0][0]=42"] print[" a =", a]
def make2dList[hàng, cột]. return [ [[0] * cols] cho hàng trong dải ô [hàng] ] rows = 3 cols = 2 a = make2dList[rows, cols] print["Đây là OK. lúc đầu. "] print[" a =", a] a[0][0] = 42 print["Và bây giờ hãy xem điều gì xảy ra sau a[0][0]=42"] print[" a =", a]
# Tạo danh sách 2d "tùy ý" a = [ [ 2, 3, 5] , [ 1, 4, 7 ] ] print["a = ", a] # Bây giờ hãy tìm kích thước của nó rows = len[a] cols = len
- Sai. Không thể sử dụng bản sao. bản sao [bản sao nông]
nhập bản sao # Tạo danh sách 2d a = [ [ 1, 2, 3 ] , [ 4, 5, 6 ] ] # Thử sao chép b = sao chép. sao chép[a] # Lỗi. tạo bản sao nông # Lúc đầu, mọi thứ có vẻ ổn print["Lúc đầu. "] print[" a =", a] print[" b =", b] # Bây giờ sửa đổi a[0][0] a[0][0] = 9 print["Nhưng sau a[0][0
- Đúng. sử dụng bản sao. bản sao sâu
nhập bản sao # Tạo danh sách 2d a = [ [ 1, 2, 3 ] , [ 4, 5, 6 ] ] # Thử sao chép b = sao chép. deepcopy[a] # Đúng. # Thoạt đầu, mọi việc có vẻ ổn print["Lúc đầu. "] print[" a =", a] print[" b =", b] # Bây giờ sửa đổi a[0][0] a[0][0] = 9 print["Và sau a[0][0
- Hạn chế sao chép. bản sao sâu
a = [[0]*2]*3 # tạo 3 bản sao nông của [bí danh của] trên cùng một hàng a[0][0] = 42 # xuất hiện để sửa đổi cả 3 hàng print[a] # print [[42, . deepcopy[a] # có nghĩa là làm cho mỗi hàng khác biệt a[0][0] = 42 # vì vậy chúng tôi hy vọng điều này chỉ sửa đổi hàng đầu tiên print[a] # VẪN in [[42, 0], [42, 0], [ . # câu trả lời hay nhất. không tạo bí danh ngay từ đầu, trừ khi bạn muốn chúng
- Nâng cao. deepcopy phá bí danh
# Nâng cao. bây giờ một lần nữa với giải pháp thay thế deepcopy đơn giản thực hiện # những gì chúng tôi nghĩ rằng deepcopy đã làm. # GHI CHÚ. cái này sử dụng đệ quy. Chúng ta sẽ xem xét cách nó hoạt động trong tương lai. nhập bản sao def myDeepCopy[a]. nếu [isinstance[a, list] hoặc isinstance[a, tuple]]. # Phiên bản hiểu danh sách # return [My DeepCopy[phần tử] cho phần tử trong] deepCopy = [] cho phần tử trong. bản sao sâu. append[myDeepCopy[element]] return deepCopy other. trả lại bản sao. copy[a] a = [[0]*2]*3 # tạo 3 bản sao nông của cùng một hàng a = myDeepCopy[a] # một lần nữa, nghĩa là làm cho mỗi hàng trở nên khác biệt a[0][0] = 42 #
- Phiên bản cơ bản
# Đây là hai chức năng hữu ích. # repr2dList[L]. trả về một chuỗi nhiều dòng được định dạng độc đáo và # print2dList[L]. in danh sách 2d theo cách được định dạng độc đáo đó ####################################### def . nếu [L == []]. return '[]' đầu ra = [ ] rows = len[L] cols = max[[len[L[row]] cho hàng trong phạm vi[hàng]]] M = [['']*cols cho hàng trong phạm vi[ . cho col trong phạm vi[len[L[row]]]. M[row][col] = repr[L[row][col]] colWidths = [0] * cols for col in range[cols]. đầu ra colWidths[col] = max[[len[M[row][col]] cho hàng trong phạm vi[hàng]]]. append['[\n'] cho hàng trong phạm vi[hàng]. đầu ra. nối thêm [' [ '] cho col trong phạm vi [cols]. nếu [col > 0]. đầu ra. đầu ra append[', ' if col < len[L[row]] other '']. chắp thêm[M[hàng][col]. đầu ra rjust[colWidths[col]]]. append[[' ],' if row < rows-1 other ' ]'] + '\n'] xuất. nối thêm [']'] trả lại ''. tham gia [đầu ra] def print2dList [L]. print[repr2dList[L]] ####################################### # Hãy đưa ra . L = [ [ 1, 23, 'a' ] , [ 4, 5, 6789, 10, 100 ] ] khẳng định[repr2dList[L] == '''\ [ [ 1, 23, 'a' ], [ 4
- Phiên bản ưa thích [có đường viền và nhãn hàng và cột]
# Hàm trợ giúp cho print2dList. # Điều này tìm độ dài tối đa của chuỗi # đại diện của bất kỳ mục nào trong danh sách 2d def maxItemLength[a]. maxLen = 0 cho hàng trong phạm vi[len[a]]. cho col trong phạm vi[len[a[row]]]. maxLen = max[maxLen, len[repr[a[row][col]]]] trả về maxLen def print2dList[a]. nếu một == []. print[[]] trả về print[] rows, cols = len[a], len[a[0]] maxCols = max[[len[row] cho hàng trong một]] fieldWidth = max[maxItemLength[a], len . ' + ['-'*[fieldWidth+3] + '. ']*maxCols print[rowPrefix, end=' '] # In nhãn cột được căn giữa cho col trong phạm vi[maxCols]. in[f'col={col}'. center[fieldWidth+2], end=' '] print['\n' + rowSeparator] cho hàng trong phạm vi[hàng]. # In nhãn hàng print[f'row={row}'. center[rowLabelSize], end='. '] # In từng mục của hàng sang phải nhưng cùng chiều rộng cho col in range[len[a[row]]]. in[repr[a[row][col]]. trung tâm [trườngWidth + 1], kết thúc ='. '] # In ra các ô bị thiếu trong mỗi cột trong trường hợp danh sách bị xáo trộn thiếuCellChar = chr[10006] for col in range[len[a[row]], maxCols]. in[missingCellChar*[fieldWidth+1], end='. '] print['\n' + rowSeparator] print[] # Hãy thử chức năng mới. a = [ [ 1, -1023, 3 ] , [ 4, 5, 678 ] ] b = [ [123, 4567, 891011], [567890, 'ABC'], ['Tuyệt vời. ', Đúng, '', -3. 14, Không]] print2dList[a] print2dList[b]
# Tạo danh sách 2d "tùy ý" a = [ [ 2, 3, 5] , [ 1, 4, 7 ] ] print["Trước. a =", a] # Bây giờ hãy tìm kích thước của nó rows = len[a] cols = len[a[0]] # Và bây giờ lặp qua mọi phần tử # Ở đây, chúng ta sẽ thêm một phần tử vào mỗi phần tử, # chỉ để tạo một . cho col trong phạm vi [cols]. # Mã này sẽ được chạy rows*cols lần, một lần cho mỗi phần tử # trong danh sách 2d a[row][col] += 1 # Cuối cùng, in kết quả print["Sau. một =", một]
- Truy cập toàn bộ hàng
# bí danh [không phải bản sao. không có danh sách mới nào được tạo] a = [ [ 1, 2, 3 ] , [ 4, 5, 6 ] ] row = 1 rowList = a[row] print[rowList]
- Truy cập toàn bộ cột
# bản sao [không phải bí danh. danh sách mới được tạo] a = [ [ 1, 2, 3 ] , [ 4, 5, 6 ] ] col = 1 colList = [ ] for i in range[len[a]]. colList += [ a[i][col] ] print[colList]
- Truy cập toàn bộ cột bằng cách hiểu danh sách
# vẫn là một bản sao, nhưng rõ ràng hơn với khả năng hiểu danh sách. a = [ [ 1, 2, 3 ] , [ 4, 5, 6 ] ] col = 1 colList = [ a[i][col] for i in range[len[a]] ] print[colList]
# Danh sách 2d không nhất thiết phải là hình chữ nhật a = [ [ 1, 2, 3 ] , [ 4, 5 ], [ 6 ], [ 7, 8, 9, 10 ] ] rows = len[a] for row in range . cols = len[a[row]] # bây giờ cols phụ thuộc vào từng hàng print["Row", row, "has", cols, "columns. ", end=""] cho col trong phạm vi [cols]. print[a[row][col], " ", end=""] print[]
# Danh sách 2d không thực sự tồn tại trong Python. # Chúng chỉ là các danh sách có chứa các danh sách khác làm phần tử. # Và do đó, điều này có thể được thực hiện đối với "danh sách 3d" hoặc thậm chí "4d" hoặc danh sách có chiều cao hơn. # Và những thứ này cũng có thể không phải là hình chữ nhật, tất nhiên. a = [ [ [ 1, 2 ], [ 3, 4 ] ], [ [ 5, 6, 7 ], [ 8, 9 ] ], [ [ 10 ] ] ] cho tôi trong phạm vi[len[a]]. cho j trong phạm vi[len[a[i]]]. cho k trong phạm vi[len[a[i][j]]]. print[f'a[{i}][{j}][{k}] = {a[i][j][k]}']