2011-12-10 27 views
14

thể trùng lặp:
How to initialize a two-dimensional array in Python?cách gửi thanh lịch để tạo ra một ma trận 2D bằng Python

Tôi đã luôn luôn được viết phần mã này theo cách này: mỗi khi tôi cần nó, tôi sử dụng mã python này:

for x in range(8): 
     a.append([]) 
     for y in range(8): 
      a[x].append(0) 

Tuy nhiên, tôi muốn biết nếu có cách nào để làm đẹp đoạn mã này. Tôi có nghĩa là, làm thế nào để bạn tạo một ma trận bidimensional trong python, và điền nó với 0?

+0

vấn đề này là khai báo và khởi tạo hai mảng chiều được giải thích độc đáo [ở đây] (http://stackoverflow.com/questions/2397141/how-to-initialize-a-hai chiều-mảng-trong-python) – gaurav

Trả lời

16

Sử dụng nested list comprehensions:

a = [[0 for y in range(8)] for x in range(8)] 

đó là eqivalent để

a = [] 
for x in range(8): 
    row = [] 
    for y in range(8): 
     row.append(0) 
    a.append(row) 
1

Bạn có thể sử dụng list comprehensions. Kể từ khi bạn không thực sự quan tâm đến các giá trị được cung cấp bởi range, bạn có thể sử dụng _, đó là thông thường là viết tắt của một giá trị, cái nào là không quan tâm đến.

Danh sách
>>> z = [[0 for _ in range(8)] for _ in range(8)] 
>>> import pprint 
>>> pprint.pprint(z) 
[[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, 0, 0, 0]] 

comprehensions cung cấp một cách ngắn gọn để tạo danh sách mà không cần sử dụng map(), filter() và/hoặc lambda. Định nghĩa danh sách kết quả thường có xu hướng rõ ràng hơn các danh sách được xây dựng bằng các cấu trúc đó.

2

Việc hiểu danh sách ngắn gọn hơn.

a = [[0 for i in xrange(8)] for i in xrange(8)] 
print a 

Hoặc bạn có thể sử dụng numpy arrays nếu bạn sẽ tính toán số với mảng. Numpy.zeros chức năng tạo ra một mảng đa chiều của số không.

import numpy as np 

a = np.zeros((8,8)) 
3

Hãy thử điều này:

a = [[0]*8 for _ in xrange(8)] 

Nó sử dụng comprehensions danh sách và thực tế là các nhà điều hành * có thể được áp dụng cho danh sách cho điền chúng với n bản sao của một nguyên tố.

Hoặc thậm chí tốt hơn, hãy viết một hàm tổng quát để trở về ma trận của một kích thước nhất định:

# m: number of rows, n: number of columns 
def create_matrix(m, n): 
    return [[0]*n for _ in xrange(m)] 

a = create_matrix(8, 8) 
Các vấn đề liên quan