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

455 python arrays

如何在Python中声明数组?

我在文档中找不到任何对数组的引用.

sep*_*p2k 337

variable = []
Run Code Online (Sandbox Code Playgroud)

现在variable引用一个空列表*.

当然这是一项任务,而非宣言.在Python中没有办法说"这个变量永远不应该引用除列表以外的任何东西",因为Python是动态类型的.


*默认的内置Python类型称为列表,而不是数组.它是一个任意长度的有序容器,可以容纳异质的对象集合(它们的类型无关紧要,可以自由混合).这不应该与array模块混淆,模块提供更接近C array类型的类型; 内容必须是同质的(所有相同的类型),但长度仍然是动态的.

  • 是否可以像在JavaScript中一样初始化数组的内容?(例如,作为`variable = ["Hi","Hello"];`?) (10认同)
  • @AndersonGreen正如我所说,在Python中没有变量声明这样的东西.你可以通过获取一个空列表并在其中放入其他列表来创建一个多维列表,或者,如果在写入时知道列表的维度,你可以将它写成这样的文字:`my_2x2_list = [[a, b],[c,d]]`.根据您需要的多维数组,您还可以考虑使用`numpy`,它定义了多维,同类,无盒装数组的数组类型,在适用的情况下可以更加高效,因此它们更适合数值计算. (7认同)
  • @AndersonGreen是的. (6认同)
  • 你会如何声明一个多维数组,然后(例如,一个2D数组?) (2认同)

Ant*_*rin 120

这是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)
Run Code Online (Sandbox Code Playgroud)

理论答案

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

其后果是:

  • 随机访问真的很便宜(arr[6653]相同arr[0])
  • append 操作是'免费',而一些额外的空间
  • insert 操作很昂贵

检查这个令人敬畏的操作复杂性表.

另外,请看这张图片,我试图显示数组,引用数组和链表之间最重要的区别: 数组,到处都是数组

  • 只是补充一点,在python中有一种非常酷的方法来切割数组:因为`[1,2,3,4,5,6,7,8,9] [1:-2]`结果将是`[2 ,3,4,5,6,7]` (3认同)
  • 我看到这个帖子不时有些投票.如果有人可以发一个字,为什么会很棒.谢谢. (2认同)
  • 你是真正的MVP。需要了解“列表”的实际选择设计,以便做出合理的编程决策。基本上它就像 C++ 中的“向量”。谢谢! (2认同)

Len*_*bro 118

你实际上没有声明事情,但这是你在Python中创建数组的方式:

from array import array
intarray = array('i')
Run Code Online (Sandbox Code Playgroud)

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

现在可能你不想要一个数组,而是一个列表,但其他人已经回答了这个问题.:)

  • 不,但是其他人都已经使用过清单了.我认为指出阵列也是一个很好的答案. (58认同)
  • 对于标记为"初学者"的问题,这很有趣,但不是一个很好的答案.只是为了说清楚:在Python中,你通常使用一种名为`list`的数据类型.Python有一个特殊用途的数据类型叫做`array`,它更像是一个C数组,很少使用. (10认同)
  • 这个答案的超级疯狂道具.我已经用Python编程多年了,直到最近才发现有一个实际的Python数组对象与list对象不同.虽然数据结构非常相似,但数组限制了数组可以容纳的对象类型.很棒的答案@LennartRegebro! (7认同)
  • 这应该是正确答案List和Arrays是两个不同的东西@LennartRegebro谢谢 (4认同)

lim*_*ker 66

我认为你(意味着)想要一个已填充前30个单元格的列表.所以

   f = []

   for i in range(30):
       f.append(0)
Run Code Online (Sandbox Code Playgroud)

可以使用它的一个例子是Fibonacci序列.请参阅Project Euler中的问题2

  • 这是初始化列表的一种相当巴洛克式的方式.请尝试`f = [0]*30`. (87认同)

can*_*eed 37

这是如何:

my_array = [1, 'rebecca', 'allard', 15]
Run Code Online (Sandbox Code Playgroud)

  • 既然这不是python数组而是python列表,那么称它为"my_list"会不会让人感到困惑? (4认同)
  • 这将创建一个列表,而不是一个数组。它们是不同的,并且在python中具有不同的属性。具体来说,您可以对数组执行数字运算,但不能对列表执行数值运算。 (3认同)

hus*_*sam 17

一些贡献表明python中的数组由列表表示.这是不正确的.Python array()在标准库模块中有一个独立的实现array " array.array()"因此混淆两者是不正确的.列表是python中的列表,因此请小心使用的命名法.

list_01 = [4, 6.2, 7-2j, 'flo', 'cro']

list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']
Run Code Online (Sandbox Code Playgroud)

列表和列表之间有一个非常重要的区别array.array().虽然这两个对象都是有序序列,但array.array()是有序的齐次序列,而列表是非同构序列.


bay*_*yer 16

你没有用Python声明任何东西.你只需要使用它.我建议你从http://diveintopython.net开始.

  • 有时你必须声明一个变量的类型:如果你之前不使用它,一个控制结构,它不存在于控制结构之外,然后你将构造一个新变量。然后假设变量是一个 int,如果您将其用作更复杂的类型,则会发生冲突。 (2认同)
  • 编程就是声明,无论您使用哪种语言。类型声明是完全不同的故事 (2认同)

Rem*_*emi 16

为了计算,使用像这样的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
Run Code Online (Sandbox Code Playgroud)

这些numpy数组可以从磁盘中保存和加载(甚至是压缩的),并且具有大量元素的复杂计算速度很快.很多用于科学环境.请看这里了解更多......


non*_*tor 13

我通常只会这样做a = [1,2,3],list但是arrays看看这个正式的定义


Mel*_*vin 11

要添加到Lennart的答案,可以像这样创建一个数组:

from array import array
float_array = array("f",values)
Run Code Online (Sandbox Code Playgroud)

其中可以采用元组,列表或np.array的形式,但不是数组:

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
Run Code Online (Sandbox Code Playgroud)

输出仍然是相同的:

print(float_array)
print(float_array[1])
print(isinstance(float_array[1],float))

# array('f', [1.0, 2.0, 3.0])
# 2.0
# True
Run Code Online (Sandbox Code Playgroud)

列表的大多数方法也使用数组,常见的是pop(),extend()和append().

从答案和评论来看,似乎阵列数据结构并不那么受欢迎.我喜欢它,就像人们可能更喜欢列表中的元组一样.

数组结构比list或np.array具有更严格的规则,这可以减少错误并使调试更容易,尤其是在处理数值数据时.

尝试将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
Run Code Online (Sandbox Code Playgroud)

保持数组形式的整数值(例如索引列表)可能会阻止"TypeError:list indices必须是整数,而不是float",因为数组可以迭代,类似于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])
Run Code Online (Sandbox Code Playgroud)

令人讨厌的是,将一个int附加到float数组将导致int变为float,而不会引发异常.

np.array也为其条目保留相同的数据类型,但它不会发出错误,而是更改其数据类型以适应新条目(通常为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
Run Code Online (Sandbox Code Playgroud)

在任务期间也是如此.如果指定了数据类型,则np.array将尽可能将条目转换为该数据类型:

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_'>
Run Code Online (Sandbox Code Playgroud)

或者,实质上:

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
Run Code Online (Sandbox Code Playgroud)

而数组将简单地给出:

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

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

对于我发现相当讨厌的东西:数据类型被指定为array()中的第一个参数,但(通常)是np.array()中的第二个参数.:|

与C的关系在这里提到: Python List vs. Array - 何时使用?

玩得开心!

注意:数组的类型和相当严格的性质更倾向于C而不是Python,并且根据设计,Python在其函数中没有许多特定于类型的约束.它的不受欢迎也会在协同工作中产生积极的反馈,而替换它主要涉及额外的[int(x)for x in file].因此,忽略阵列的存在是完全可行和合理的.它不应该以任何方式阻碍我们大多数人.:d


csa*_*nho 9

JohnMachin的评论应该是真正的答案.在我看来,所有其他答案都只是解决方法!所以:

array=[0]*element_count
Run Code Online (Sandbox Code Playgroud)

  • 同意。除非小心地将变量称为“数组”,否则会引起纯粹主义者的愤怒。对此我还要补充一点,您可以类似地创建“多维数组”:`x=[[0] * 10] * 10` (2认同)
  • @PeterSMagnusson,你尤其应该**不**对多维数组这样做。将会发生的情况是,每一行都是相同的,因为它们都是对同一对象的引用。例如尝试一下:`x = [[0]*5]*5; x[1][2] = 1;打印(x)` (2认同)

小智 7

这个怎么样...

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


cam*_*amh 6

继Lennart之后,还有numpy实现了均匀的多维数组.


Col*_*nic 6

Python将它们称为列表.您可以使用方括号和逗号编写列表文字:

>>> [6,28,496,8128]
[6, 28, 496, 8128]
Run Code Online (Sandbox Code Playgroud)