Làm cách nào để lấy một mảng trống có kích thước bất kỳ trong python?


120

Về cơ bản tôi muốn có một python tương đương với điều này trong C:

int a[x];

nhưng trong python tôi khai báo một mảng như:

a = []

và vấn đề là tôi muốn chỉ định các vị trí ngẫu nhiên với các giá trị như:

a[4] = 1

nhưng tôi không thể làm điều đó với python, vì mảng trống.

Câu trả lời:


239

Nếu theo "mảng", bạn thực sự có nghĩa là một danh sách Python, bạn có thể sử dụng

a = [0] * 10

hoặc là

a = [None] * 10

91
Một điều bạn phải chú a = [obj] * Ný là cùng một đối tượng xuất hiện trong mỗi phần tử của mảng. Nếu nó là một đối tượng có thể thay đổi và bạn sửa đổi một mục, tất cả sẽ bị thay đổi. ... Nhưng, đối với ví dụ này sử dụng số nguyên (hoặc bất kỳ kiểu bất biến nào khác), nó không có gì khác biệt. Hoặc, nếu bạn chỉ gán cho các phần tử, nó cũng không phải là vấn đề. (Tôi đề cập đến nó bởi vì tôi đã thực hiện chính xác điều đó quá thường :))
dappawit

4
Điều đó khiến tôi khó khăn trong dự án Python đầu tiên của mình, @dappawit. Chú ý đến cảnh báo này.
The Nate

nó tạo ra cùng một tài liệu tham khảo cho các đối tượng
Amr Alaa

22

Bạn không thể làm chính xác những gì bạn muốn bằng Python (nếu tôi đọc bạn chính xác). Bạn cần đặt các giá trị cho từng phần tử của danh sách (hay như cách bạn gọi là mảng).

Nhưng, hãy thử điều này:

a = [0 for x in range(N)]  # N = size of list you want
a[i] = 5  # as long as i < N, you're okay

Đối với danh sách các loại khác, sử dụng một cái gì đó bên cạnh 0. Nonecũng thường là một lựa chọn tốt.


2
Câu trả lời này giáp với không chính xác. range(N)sẽ tạo ra một danh sách nếu Python <3.0.
Apalala

1
Đúng, nó sẽ tạo ra một danh sách. Nếu bạn lo lắng về hiệu quả, bạn có thể sử dụng xrange(N)Python 2.x. Tuy nhiên, tôi không chắc nó giáp với cái không chính xác như thế nào. Tôi thích nó hơn a = range(N)vì mọi phần tử bắt đầu ở một "mặc định" hợp lý. Tôi đoán đó là một vấn đề quan điểm.
dappawit

16

Bạn có thể sử dụng numpy:

import numpy as np

Ví dụ từ Mảng trống :

np.empty([2, 2])
array([[ -9.74499359e+001,   6.69583040e-309],
       [  2.13182611e-314,   3.06959433e-309]])  

7

Chỉ cần khai báo danh sách và nối từng phần tử. Đối với ví dụ:

a = []
a.append('first item')
a.append('second item')

5
Làm thế nào bạn rồi 'khe ngẫu nhiên assign'
Tdelang

5

bạn cũng có thể mở rộng điều đó với phương pháp mở rộng danh sách.

a= []
a.extend([None]*10)
a.extend([None]*20)

1

Nếu bạn (hoặc những người tìm kiếm khác về câu hỏi này) thực sự quan tâm đến việc tạo một mảng liền kề để lấp đầy các số nguyên, hãy xem xét bytearraymemoryivew :

# cast() is available starting Python 3.3
size = 10**6 
ints = memoryview(bytearray(size)).cast('i') 

ints.contiguous, ints.itemsize, ints.shape
# (True, 4, (250000,))

ints[0]
# 0

ints[0] = 16
ints[0]
# 16

1
x=[]
for i in range(0,5):
    x.append(i)
    print(x[i])

2
Mặc dù mã này có thể giải quyết câu hỏi, bao gồm giải thích về cách thức và lý do tại sao điều này giải quyết vấn đề sẽ thực sự giúp cải thiện chất lượng bài đăng của bạn và có thể dẫn đến nhiều phiếu bầu hơn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ người hỏi bây giờ. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những giới hạn và giả định nào được áp dụng.
Daniil

0

Nếu bạn thực sự muốn một mảng kiểu C

import array
a = array.array('i', x * [0])
a[3] = 5
try:
   [5] = 'a'
except TypeError:
   print('integers only allowed')

Lưu ý rằng không có khái niệm về chưa khởi tạo trong python. Một biến là một tên được liên kết với một giá trị, vì vậy giá trị đó phải có một cái gì đó. Trong ví dụ trên, mảng được khởi tạo bằng các số không.

Tuy nhiên, điều này không phổ biến trong python, trừ khi bạn thực sự cần nó cho những thứ cấp thấp. Trong hầu hết các trường hợp, bạn nên sử dụng danh sách trống hoặc mảng trống rỗng, như các câu trả lời khác đề xuất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.