如何在Python中声明一个数组?

我如何在Python中声明一个数组?

我无法在文档中find对数组的任何引用。

 variable = [] 

现在variable指的是一个空的列表*

当然这是一个任务,而不是一个声明。 在Python中没有办法说“这个variables不应该引用列表以外的任何东西”,因为Python是dynamictypes的。


*默认的内置Pythontypes称为列表 ,而不是数组。 它是一个任意长度的有序容器,可以容纳异质的对象集合(它们的types不重要,可以自由混合)。 这不应该与array模块混淆,它提供了一种更接近于C arraytypes的types; 内容必须是同质的(全部是相同的types),但是长度仍然是dynamic的。

你实际上并没有声明,但是这是你如何在Python中创build一个数组:

 from array import array intarray = array('i') 

有关更多信息,请参阅数组模块: http : //docs.python.org/library/array.html

现在可能你不想要一个数组,但一个列表,但其他人已经回答了。 🙂

我想你(意思是)想要一个已经填满了前30个单元的列表。 所以

  f = [] for i in range(30): f.append(0) 

Fibonacci序列中可以使用的一个例子。 请参阅欧拉项目中的问题2

这是如何:

 my_array = [1, 'rebecca', 'allard', 15] 

这是Python中令人惊讶的复杂主题。

实际的答案

数组由类list表示(请参阅参考资料 ,不要将它们与发生器混合使用)。

查看使用示例:

 # 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) 

理论答案

在引擎盖下,Python的list是包含对项目引用的真实数组的包装。 此外,底层数组创build一些额外的空间。

结果是:

  • 随机存取确实很便宜( arr[6653]arr[0]相同)
  • append操作是“免费”,而有一些额外的空间
  • insert操作很昂贵

检查这个真棒表的操作复杂性 。

另外,请看这张图片,我试图展示数组,引用数组和链表之间最重要的区别: 数组,数组无处不在

你不要在Python中声明任何东西。 你只是用它。 我build议你从http://diveintopython.net开始; 。

为了计算,使用像这样的numpy数组:

 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数组可以保存并从磁盘加载(甚至是压缩的),并且具有大量元素的复杂计算就像C一样快。 很多用于科学环境。 在这里看到更多…

我通常会做a = [1,2,3]这实际上是一个listarrays看看这个正式的定义

一些贡献表明Python中的数组是用列表来表示的。 也许在理论上/底下是正确的,但是两者之间的主要区别在于列表接受混合数据types和混合数字types的事实,另一方面数组需要将所有元素限制为确定types的types代码:

 list_01 = [4, 6.2, 7-2j, 'flo', 'cro'] list_01 Out[85]: [4, 6.2, (7-2j), 'flo', 'cro'] 

这是不可能的使用array()。

为了增加Lennart的答案,可以像这样创build一个数组:

 from array import array float_array = array("f",values) 

可以采取元组,列表或np.array的forms,但不是数组:

 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 

并且输出将仍然是相同的:

 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()。

从答案和评论看,arrays数据结构看起来并不那么stream行。 我喜欢它,就像一个人可能更喜欢列表上的元组一样。

数组结构比列表或np.array有更严格的规则,这可以减less错误并使debugging更容易,特别是在处理数字数据时。

尝试插入/附加一个float到一个int数组将会抛出一个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 

保持数组中的整数(例如索引列表)可能因此阻止“TypeError:列表索引必须是整数,而不是浮点数”,因为数组可以迭代,类似于np.array和lists:

 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,而不会引发exception。

np.array也为它的入口保留相同的数据types,但是不是给出错误,而是改变它的数据types以适应新的入口(通常是double或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 

在分配过程中也是如此。 如果指定了数据types,则np.array会尽可能将条目转换为该数据types:

 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_'> 

或者实质上是:

 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 

而数组将只是给:

 invalid_array = array([1,2,3.9],'i') # TypeError: integer argument expected, got float 

因此,将np.array用于types特定的命令并不是一个好主意。 数组结构在这里很有用。 列表保留值的数据types。

而对于我觉得很讨厌的东西:数组types被指定为array()中的第一个参数,但是(通常)是np.array()中的第二个参数。 :|

与C的关系在这里被引用: Python列表与数组 – 何时使用?

玩得开心!

注意:数组的types化和相当严格的性质更倾向于C而不是Python,并且通过devise,Python的函数中没有许多types特定的约束条件。 它的不受欢迎还在协作工作中产生了积极的反馈,取而代之的是大部分涉及到一个额外的[int(x)for x in file]。 因此忽略数组的存在是完全可行和合理的。 它不应以任何方式妨碍我们大多数人。 :d

在Lennart之后,还有一些实现均匀多维arrays的numpy 。

这个怎么样…

 >>> a = range(12) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] >>> a[7] 6 

Python将它们称为列表 。 你可以写一个带有方括号和逗号的列表文字:

 >>> [6,28,496,8128] [6, 28, 496, 8128] 

我有一个string数组,需要一个相同长度的布尔值的数组,启动为True。 这就是我所做的

 strs = ["Hi","Bye"] bools = [ True for s in strs ]