Làm cách nào để khai báo một mảng trong Python ?
Tôi không thể tìm thấy bất kỳ tham chiếu đến các mảng trong tài liệu.
__getitem__
không sẽ là O (1).
Làm cách nào để khai báo một mảng trong Python ?
Tôi không thể tìm thấy bất kỳ tham chiếu đến các mảng trong tài liệu.
__getitem__
không sẽ là O (1).
Câu trả lời:
variable = []
Bây giờ variable
đề cập đến một danh sách trống * .
Tất nhiên đây là một bài tập, không phải là một tuyên bố. Không có cách nào để nói trong Python "biến này không bao giờ nên đề cập đến bất cứ điều gì ngoài danh sách", vì Python được gõ động.
* Kiểu Python dựng sẵn mặc định được gọi là danh sách , không phải là mảng. Nó là một thùng chứa có chiều dài tùy ý có thể chứa một bộ sưu tập các đối tượng không đồng nhất (loại của chúng không quan trọng và có thể được trộn tự do). Điều này không nên nhầm lẫn với array
mô-đun , cung cấp một loại gần với array
loại C ; nội dung phải đồng nhất (tất cả cùng loại), nhưng độ dài vẫn động.
variable = ["Hi", "Hello"];
?)
my_2x2_list = [[a, b], [c, d]]
. Tùy thuộc vào những gì bạn cần mảng nhiều chiều cho, bạn cũng có thể xem xét sử dụng numpy
, trong đó xác định các kiểu mảng cho mảng đa chiều, đồng nhất, không có hộp có thể hiệu quả hơn nhiều khi áp dụng, vì vậy chúng thích hợp hơn cho tính toán số.
Đây là chủ đề phức tạp đáng ngạc nhiên trong Python.
Mảng được đại diện bởi lớp list
(xem tài liệu tham khảo và không trộn chúng với máy phát điện ).
Kiểm tra các ví dụ sử dụng:
# empty array
arr = []
# init with values (can contain mixed types)
arr = [1, "eels"]
# get item by index (can be negative to access end of array)
arr = [1, 2, 3, 4, 5, 6]
arr[0] # 1
arr[-1] # 6
# get length
length = len(arr)
# supports append and insert
arr.append(8)
arr.insert(6, 7)
Dưới mui xe Python list
là một trình bao bọc cho một mảng thực có chứa các tham chiếu đến các mục. Ngoài ra, mảng bên dưới được tạo ra với một số không gian thêm.
Hậu quả của việc này là:
arr[6653]
tương tự arr[0]
)append
hoạt động là 'miễn phí' trong khi một số không gian thêminsert
hoạt động tốn kémKiểm tra bảng phức tạp hoạt động tuyệt vời này .
Ngoài ra, vui lòng xem ảnh này, nơi tôi đã cố gắng thể hiện sự khác biệt quan trọng nhất giữa mảng, mảng tham chiếu và danh sách được liên kết:
[1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]
kết quả sẽ là[2, 3, 4, 5, 6, 7]
a == b[:2]
trả về True nếu 2 phần tử đầu tiên của b bằng với các giá trị của mảng a
Bạn không thực sự khai báo mọi thứ, nhưng đây là cách bạn tạo một mảng trong Python:
from array import array
intarray = array('i')
Để biết thêm thông tin, hãy xem mô-đun mảng: http://docs.python.org/l Library / array.html
Bây giờ có thể bạn không muốn một mảng, nhưng một danh sách, nhưng những người khác đã trả lời điều đó rồi. :)
list
. Python có một kiểu dữ liệu cho mục đích đặc biệt gọi array
là mảng C giống với mảng C hơn và ít được sử dụng.
Tôi nghĩ bạn (có nghĩa là) muốn có một danh sách với 30 ô đầu tiên đã được điền. Vì thế
f = []
for i in range(30):
f.append(0)
Một ví dụ về nơi mà điều này có thể được sử dụng là trong chuỗi Fibonacci. Xem vấn đề 2 trong Project Euler
f = [0] * 30
thay thế.
Đây là cách:
my_array = [1, 'rebecca', 'allard', 15]
Để tính toán, hãy sử dụng các mảng numpy như thế này:
import numpy as np
a = np.ones((3,2)) # a 2D array with 3 rows, 2 columns, filled with ones
b = np.array([1,2,3]) # a 1D array initialised using a list [1,2,3]
c = np.linspace(2,3,100) # an array with 100 points beteen (and including) 2 and 3
print(a*1.5) # all elements of a times 1.5
print(a.T+b) # b added to the transpose of a
các mảng numpy này có thể được lưu và tải từ đĩa (thậm chí được nén) và các phép tính phức tạp với số lượng lớn các phần tử giống như C nhanh.
Được sử dụng nhiều trong môi trường khoa học. Xem ở đây để biết thêm.
Nhận xét của JohnMachin nên là câu trả lời thực sự. Tất cả các câu trả lời khác chỉ là cách giải quyết theo ý kiến của tôi! Vì thế:
array=[0]*element_count
x=[[0] * 10] * 10
Một vài đóng góp cho thấy các mảng trong python được thể hiện bằng các danh sách. Điều này là không chính xác. Python có một triển khai độc lập array()
trong mô-đun thư viện tiêu chuẩn array
" array.array()
" do đó không chính xác để nhầm lẫn giữa hai. Danh sách là danh sách trong python, vì vậy hãy cẩn thận với danh pháp được sử dụng.
list_01 = [4, 6.2, 7-2j, 'flo', 'cro']
list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']
Có một sự khác biệt rất quan trọng giữa danh sách và array.array()
. Trong khi cả hai đối tượng này được sắp xếp theo thứ tự, mảng.array () là một chuỗi đồng nhất có thứ tự trong khi danh sách là một chuỗi không đồng nhất.
Bạn không khai báo bất cứ điều gì trong Python. Bạn chỉ cần sử dụng nó. Tôi khuyên bạn nên bắt đầu với một cái gì đó như http://diveintopython.net .
Tôi thường chỉ làm điều a = [1,2,3]
đó thực sự là một list
nhưng để arrays
xem định nghĩa chính thức này
Để thêm vào câu trả lời của Lennart, một mảng có thể được tạo như thế này:
from array import array
float_array = array("f",values)
trong đó các giá trị có thể ở dạng một tuple, list hoặc np.array, nhưng không phải là mảng:
values = [1,2,3]
values = (1,2,3)
values = np.array([1,2,3],'f')
# 'i' will work here too, but if array is 'i' then values have to be int
wrong_values = array('f',[1,2,3])
# TypeError: 'array.array' object is not callable
và đầu ra vẫn sẽ giống nhau:
print(float_array)
print(float_array[1])
print(isinstance(float_array[1],float))
# array('f', [1.0, 2.0, 3.0])
# 2.0
# True
Hầu hết các phương thức cho danh sách cũng hoạt động với mảng, các phương thức phổ biến là pop (), extend () và append ().
Đánh giá từ các câu trả lời và nhận xét, có vẻ như cấu trúc dữ liệu mảng không phổ biến. Mặc dù vậy, tôi thích nó, giống như cách người ta có thể thích một tuple trong danh sách.
Cấu trúc mảng có các quy tắc chặt chẽ hơn so với danh sách hoặc np.array và điều này có thể giảm lỗi và giúp gỡ lỗi dễ dàng hơn, đặc biệt là khi làm việc với dữ liệu số.
Nỗ lực chèn / nối một float vào một mảng int sẽ ném TypeError:
values = [1,2,3]
int_array = array("i",values)
int_array.append(float(1))
# or int_array.extend([float(1)])
# TypeError: integer argument expected, got float
Do đó, việc giữ các giá trị có nghĩa là số nguyên (ví dụ: danh sách các chỉ mục) ở dạng mảng có thể ngăn "Chỉ số danh sách TypeError: phải là số nguyên, không nổi", vì các mảng có thể được lặp lại, tương tự như np.array và danh sách:
int_array = array('i',[1,2,3])
data = [11,22,33,44,55]
sample = []
for i in int_array:
sample.append(data[i])
Khó chịu, việc thêm một int vào một mảng float sẽ khiến int trở thành một float, mà không đưa ra một ngoại lệ.
np.array cũng giữ nguyên kiểu dữ liệu cho các mục nhập của nó, nhưng thay vì đưa ra lỗi, nó sẽ thay đổi kiểu dữ liệu để phù hợp với các mục mới (thường là gấp đôi hoặc str):
import numpy as np
numpy_int_array = np.array([1,2,3],'i')
for i in numpy_int_array:
print(type(i))
# <class 'numpy.int32'>
numpy_int_array_2 = np.append(numpy_int_array,int(1))
# still <class 'numpy.int32'>
numpy_float_array = np.append(numpy_int_array,float(1))
# <class 'numpy.float64'> for all values
numpy_str_array = np.append(numpy_int_array,"1")
# <class 'numpy.str_'> for all values
data = [11,22,33,44,55]
sample = []
for i in numpy_int_array_2:
sample.append(data[i])
# no problem here, but TypeError for the other two
Điều này đúng trong quá trình chuyển nhượng là tốt. Nếu loại dữ liệu được chỉ định, np.array sẽ, bất cứ khi nào có thể, sẽ chuyển đổi các mục nhập thành loại dữ liệu đó:
int_numpy_array = np.array([1,2,float(3)],'i')
# 3 becomes an int
int_numpy_array_2 = np.array([1,2,3.9],'i')
# 3.9 gets truncated to 3 (same as int(3.9))
invalid_array = np.array([1,2,"string"],'i')
# ValueError: invalid literal for int() with base 10: 'string'
# Same error as int('string')
str_numpy_array = np.array([1,2,3],'str')
print(str_numpy_array)
print([type(i) for i in str_numpy_array])
# ['1' '2' '3']
# <class 'numpy.str_'>
hoặc, về bản chất:
data = [1.2,3.4,5.6]
list_1 = np.array(data,'i').tolist()
list_2 = [int(i) for i in data]
print(list_1 == list_2)
# True
trong khi mảng đơn giản sẽ cung cấp:
invalid_array = array([1,2,3.9],'i')
# TypeError: integer argument expected, got float
Bởi vì điều này, không nên sử dụng np.array cho các lệnh dành riêng cho loại. Cấu trúc mảng rất hữu ích ở đây. danh sách bảo tồn kiểu dữ liệu của các giá trị.
Và đối với một cái gì đó tôi thấy khá phiền phức: kiểu dữ liệu được chỉ định làm đối số đầu tiên trong mảng (), nhưng (thường) là thứ hai trong np.array (). : |
Mối quan hệ với C được đề cập ở đây: Danh sách Python so với Mảng - khi nào nên sử dụng?
Hãy vui vẻ khám phá!
Lưu ý: Bản chất được gõ và khá nghiêm ngặt của mảng dựa nhiều vào C hơn là Python và theo thiết kế Python không có nhiều ràng buộc về kiểu cụ thể trong các hàm của nó. Tính phổ biến của nó cũng tạo ra một phản hồi tích cực trong công việc cộng tác và thay thế nó chủ yếu liên quan đến một [int (x) bổ sung cho x trong tệp]. Do đó, hoàn toàn khả thi và hợp lý để bỏ qua sự tồn tại của mảng. Nó không nên cản trở hầu hết chúng ta bằng mọi cách. : D
Python gọi chúng là danh sách . Bạn có thể viết một danh sách bằng chữ với dấu ngoặc vuông và dấu phẩy:
>>> [6,28,496,8128]
[6, 28, 496, 8128]
Tôi đã có một chuỗi các chuỗi và cần một mảng có cùng độ dài booleans được khởi tạo thành True. Đây là những gì tôi đã làm
strs = ["Hi","Bye"]
bools = [ True for s in strs ]
int count[26]={0};
Có lẽ có một cách tốt hơn nhưng biến thể bools
từ trên đã hoạt động count=[0 for ii in range(26)]
Sau đó, sau đó tôi đã thay đổi nó thành count=[0]*26
có vẻ thích hợp hơn.
Bạn có thể tạo danh sách và chuyển đổi chúng thành mảng hoặc bạn có thể tạo mảng bằng mô-đun numpy. Dưới đây là một vài ví dụ để minh họa tương tự. Numpy cũng làm cho nó dễ dàng hơn để làm việc với các mảng đa chiều.
import numpy as np
a = np.array([1, 2, 3, 4])
#For custom inputs
a = np.array([int(x) for x in input().split()])
Bạn cũng có thể định hình lại mảng này thành ma trận 2X2 bằng cách sử dụng chức năng định hình lại lấy đầu vào làm kích thước của ma trận.
mat = a.reshape(2, 2)