2013-07-14 74 views
6

Tôi muốn khởi tạo danh sách đa chiều. Về cơ bản, tôi muốn có một lưới 10x10 - một danh sách 10 danh sách chứa 10 mục.Python: khởi tạo danh sách đa chiều

Mỗi giá trị danh sách nên được khởi tạo đến số nguyên 0.

Các cách rõ ràng để làm điều này trong một lớp lót: myList = [[0]*10]*10 sẽ không làm việc vì nó tạo ra một danh sách các tài liệu tham khảo 10 đến một danh sách, vì vậy thay đổi một mục trong bất kỳ hàng nào thay đổi nó trong tất cả các hàng.

Tài liệu tôi đã xem các cuộc thảo luận về việc sử dụng [:] để sao chép danh sách, nhưng điều đó vẫn không hoạt động khi sử dụng hệ số: myList = [0]*10; myList = myList[:]*10 có tác dụng tương tự như myList = [[0]*10]*10.

Ngắn tạo vòng lặp myList.append() s, có cách nhanh chóng hiệu quả để khởi tạo danh sách theo cách này không?

+0

Tôi nghĩ ý tưởng '[:]' cũng có thể hoạt động, ví dụ: '[x [:] cho x trong [[0] * 10] * 10]'. – DSM

Trả lời

14

Bạn có thể làm điều đó khá hiệu quả với sự hiểu biết:

a = [[0] * number_cols for i in range(number_rows)] 
+1

Rất tốt, tránh vòng lặp lồng nhau mà câu trả lời rõ ràng có, nhưng chỉ hoạt động nếu giá trị mà bạn muốn mảng khởi tạo là không thể tham chiếu nhiều lần, vì vậy không nếu bạn muốn mảng được điền với các cá thể duy nhất của một lớp. – Perkins

+0

Điều đó là chính xác. Vui mừng khi bạn mang nó lên. – cheeyos

+0

Hoàn hảo. Hoạt động tuyệt vời. Cảm ơn! – fdmillion

7

Đây là công việc cho ... danh sách lồng nhau được hiểu!

[[0 for i in range(10)] for j in range(10)] 
+1

Tôi tin rằng điều này rõ ràng hơn và * thường * thích hợp hơn với các lựa chọn thay thế (như sử dụng '[0] * 10'). – ZX9

0

Bạn thực sự có thể cần một array thay vì một số danh sách. Hầu như mỗi lần tôi nhìn thấy mẫu "danh sách lồng nhau được lập trước" này, có điều gì đó không hoàn toàn đúng.

2

Chỉ cần nghĩ rằng tôi muốn thêm câu trả lời vì câu hỏi được yêu cầu cho trường hợp n chiều chung và tôi không nghĩ rằng câu trả lời được nêu ra. Bạn có thể làm điều này một cách đệ quy cho bất kỳ số thứ nguyên nào với ví dụ sau:

n_dims = [3, 4, 5] 

empty_list = 0 
for n in n_dims: 
    empty_list = [empty_list] * n 

>>>empty_list 
>>>[[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]], 
    [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]], 
    [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]], 
    [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]], 
    [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]] 
+0

Điều này có cùng một vấn đề như mô tả trong câu hỏi - nó tạo ra nhiều tham chiếu đến cùng một danh sách. –

Các vấn đề liên quan