2012-03-31 46 views
5

Tôi gặp sự cố khi khởi tạo mảng 2D trong python. Tôi muốn có một mảng 6x6, tôi đã làmKhởi tạo mảng 2D trong Python

arr = [[None]*6]*6 

Nhưng khi tôi làm:

>>> arr[1][2]=10 
>>> arr 
[[None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None], [None, None, 10, None, None, None]] 

Thông báo tôi chỉ cần đặt 1 mục, và nó "sao chép" trên tất cả các hàng. Chuyện gì vậy? Tôi nghĩ rằng nó đã làm với tham chiếu của nó cùng một danh sách, nhưng làm thế nào để sửa lỗi này?

I figured

for key, _ in algos.items(): 
    algoData[key] = [] 
    for i in range(0,6): 
     algoData[key].append([]) 
     for j in range(0,6): 
      algoData[key][i].append(None) 

công trình, nhưng có vẻ như thời gian để chỉ khởi tạo một mảng 6x6 trống, những gì nếu tôi muốn có một mảng 10000x10000, nó sẽ rất không hiệu quả?

CẬP NHẬT

Tôi có thể cũng khởi tạo một từ điển của mảng 2D? Tôi có một cuốn từ điển như:

algos = { "FIFO": ..., "LRU": ..., "Random": ... } 

Tôi muốn khởi tạo một từ điển như dưới đây:

algoData = { "FIFO": 2D arr, "LRU": 2D arr, "Random": 2D arr } 

Trả lời

14

Sử dụng comprehensions danh sách, bạn có thể nói:

arr = [[None for x in range(6)] for y in range(6)] 

Sau đó, bạn sẽ có arr[1][2] = 10 làm việc như mong đợi. Tuy nhiên, đây không phải là điều bình thường. Bạn sẽ sử dụng danh sách lồng nhau để làm gì? Có thể có một cách tốt hơn. Ví dụ, làm việc với các mảng được thực hiện dễ dàng hơn nhiều với gói numpy.

+0

Tôi muốn lưu trữ dữ liệu để sử dụng với matplotlib (một ô bề mặt 3D) –

+3

Trong trường hợp đó, tôi chắc chắn sẽ đề nghị gọn gàng. Nó được sử dụng trong [ví dụ này] (http://matplotlib.sourceforge.net/examples/animation/simple_3danim.html), nếu bạn muốn xem mẫu. Tiết kiệm cho mình công việc; nó là một gói tuyệt vời. – Cameron

+0

Vì vậy, dòng tôi cần sẽ chỉ là 'lineData = np.empty ((dims, length))'? –

15

@Cameron đúng khi đề xuất bạn sử dụng NumPy để xử lý các mảng dữ liệu số. Và cho phần thứ hai của câu hỏi của bạn, ~ Niklas B. là tại chỗ với đề nghị của mình để sử dụng defaultdict.

Điều chưa được đề cập là lý do tại sao[[None]*6]*6 hoạt động lạ.

Câu trả lời là [None]*6 tạo ra một danh sách với sáu None s trong đó (như bạn mong đợi), nhưng [list]*6 không làm cho sáu bản độc lập của list - nó làm cho sáu bản của một tài liệu tham khảo đến cùnglist .

Python đơn sắc có phần có thể giải thích điều này tốt hơn: "Other languages have variables - Python has names".