How to declare an array in Python?
如何在Python中声明数组?
在文档中找不到对数组的任何引用。
1 | variable = [] |
现在,
当然,这是一个任务,而不是一个声明。在python中没有办法说"这个变量不应该引用除列表之外的任何东西",因为python是动态类型的。
*默认的内置python类型称为列表,而不是数组。它是一个任意长度的有序容器,可以容纳不同类型的对象(它们的类型不重要,可以自由混合)。这不应与
您实际上并不声明内容,但这是在Python中创建数组的方法:
1 2 | from array import array intarray = array('i') |
有关更多信息,请参阅array模块:http://docs.python.org/library/array.html
现在可能您不需要数组,而是列表,但其他人已经回答了这个问题。:)
这在Python中是非常复杂的主题。
实际答案数组由类
查看使用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 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) |
理论答案
在Hood中,python的
其后果是:
- 随机存取真的很便宜(
arr[6653] 和arr[0] 是一样的) append 操作是"免费"的,同时还有一些额外的空间insert 操作成本高
查看这个令人敬畏的操作复杂性表。
另外,请看这张图片,我试图展示数组、引用数组和链接列表之间最重要的区别:
我想你(意思是)想要一个已经填满前30个单元格的列表。所以
1 2 3 4 | f = [] for i in range(30): f.append(0) |
斐波那契序列就是一个例子。参见项目Euler中的问题2
这就是如何:
1 | my_array = [1, 'rebecca', 'allard', 15] |
在python中没有声明任何内容。你就用它。我建议你从http://diveintopython.net开始。
对于计算,请使用如下numpy数组:
1 2 3 4 5 6 7 8 | 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 |
这些numpy数组可以从磁盘(甚至是压缩的)中保存和加载,并且具有大量元素的复杂计算速度非常快。多用于科学环境。更多信息请参见此处…
我通常只做
一些贡献建议用列表表示Python中的数组。这是不正确的。python在标准库模块
1 2 3 4 | list_01 = [4, 6.2, 7-2j, 'flo', 'cro'] list_01 Out[85]: [4, 6.2, (7-2j), 'flo', 'cro'] |
list和
要添加到Lennart的答案中,可以这样创建一个数组:
1 2 | from array import array float_array = array("f",values) |
其中值可以采用元组、列表或np.array的形式,但不能采用数组:
1 2 3 4 5 6 | 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 |
输出仍将相同:
1 2 3 4 5 6 7 | print(float_array) print(float_array[1]) print(isinstance(float_array[1],float)) # array('f', [1.0, 2.0, 3.0]) # 2.0 # True |
列表的大多数方法也与数组一起使用,这是常见的其中包括pop()、extend()和append()。
从答案和评论来看,数组数据结构不是很流行。不过,我还是喜欢就像人们可能更喜欢一个元组而不是一个列表。
数组结构的规则比列表或np.array更严格,这可以减少错误并使调试更容易,尤其是在使用数字数据。
尝试将浮点插入/追加到int数组将引发类型错误:
1 2 3 4 5 6 | 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 |
在数组中保留要为整数的值(例如索引列表)因此,表单可能会阻止"typeerror:列表索引必须是整数,而不是浮点",因为数组可以重复,类似于np.array和列表:
1 2 3 4 5 | int_array = array('i',[1,2,3]) data = [11,22,33,44,55] sample = [] for i in int_array: sample.append(data[i]) |
令人恼火的是,将int附加到float数组将导致int成为float,而不会引发异常。
np.array也为其条目保留相同的数据类型,但它不会给出错误,而是将其数据类型更改为适合新条目(通常为double或str):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |
这在作业期间也是如此。如果指定了数据类型,np.array将尽可能将条目转换为该数据类型:
1 2 3 4 5 6 7 8 9 10 11 12 | 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_'> |
或者,本质上:
1 2 3 4 5 | 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 |
而数组只提供:
1 2 | invalid_array = array([1,2,3.9],'i') # TypeError: integer argument expected, got float |
因此,对于类型特定的命令,使用np.array不是一个好主意。数组结构在这里很有用。列表保留值的数据类型。
对于一些我觉得很麻烦的事情:数据类型被指定为array()中的第一个参数,但(通常)在np.array()中的第二个参数。:
这里提到了与c的关系:python列表与数组-何时使用?
探索愉快!
注意:数组的类型化和相当严格的性质更倾向于C而不是python,并且根据设计,python在其函数中没有许多特定于类型的约束。它的不受欢迎也会在协作工作中产生积极的反馈,而替换它主要涉及到一个额外的[int(x)for x in file]。因此,忽略数组的存在是完全可行和合理的。它不应该以任何方式阻碍我们大多数人。D
约翰马金的评论应该是真正的答案。在我看来,所有其他的答案都只是权宜之计!所以:
1 | array=[0]*element_count |
这个怎么样…
1 2 3 4 5 | >>> a = range(12) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] >>> a[7] 6 |
python调用它们列表。您可以用方括号和逗号编写列表文字:
1 2 | >>> [6,28,496,8128] [6, 28, 496, 8128] |
在Lennart之后,还有numpy实现了均匀的多维数组。
我有一个字符串数组,需要一个相同长度的布尔值数组。我就是这么做的
1 2 | strs = ["Hi","Bye"] bools = [ True for s in strs ] |
可以创建列表并将其转换为数组,也可以使用numpy模块创建数组。下面是几个例子来说明这一点。numpy还使处理多维数组更加容易。
1 2 3 4 5 | import numpy as np a = np.array([1, 2, 3, 4]) #For custom inputs a = np.array([int(x) for x in input().split()]) |
您还可以使用将输入作为矩阵维数的"重塑"函数将此数组重塑为2x2矩阵。
1 | mat = a.reshape(2, 2) |