如何在Python中声明数组?


490

如何在Python中声明数组?

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


121
由于某些不可思议的原因,Python将数组称为“列表”。语言设计的“每个人都知道这就是所谓的东西,所以我们将要称之为”。这是一个特别糟糕的名称选择,因为它看起来像一个链表而不是数组。
格伦·梅纳德

42
@Glenn Maynard:可能是因为在类似C的语言中,数组的长度是固定的,而Python列表不是。它更像C ++中的STL向量或Java中的ArrayList。
MAK

128
之所以称为列表,是因为它是一个列表。[A(),1,'Foo',u'öäöäöö',67L,5.6]。一个列表。数组是“项目在计算机内存中等距地址处的排列”(维基百科)。
Lennart Regebro

35
关于普遍理解的术语“数组”,并没有暗示固定的长度或有关内容的任何含义;这些只是C的特定数组实现的限制。Python列表的间距相等(内部指向对象的指针),否则__getitem__将不是O(1)。
格伦·梅纳德

24
@Glenn,来自en.wikipedia.org/wiki/Array_data_structure:“数组数据结构的元素必须具有相同的大小”(Python数组为true,Python列表为true)和“有效索引元组和通常,在使用数组时,元素的地址(以及元素的寻址公式)通常是固定的”(在Python中,列表或数组都不是正确的)。
Alex Martelli,2009年

Answers:


358
variable = []

现在variable引用一个空列表*

当然,这是分配,而不是声明。在Python中,没有办法说“此变量不应引用列表以外的任何东西”,因为Python是动态类型的。


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


11
是否可以像在JavaScript中那样初始化数组的内容?(例如as variable = ["Hi", "Hello"];?)
Anderson Green

6
@AndersonGreen是的。
sepp2k

3
您将如何声明一个多维数组,然后(例如2D数组?)
Anderson Green

7
@AndersonGreen正如我所说的,Python中没有变量声明之类的东西。:你会采取一个空的列表,并把其他列表里面,或者如果该列表的尺寸是在写时已经知道,你可能只是把它写成这样的文字创建多维列表my_2x2_list = [[a, b], [c, d]]。根据您需要的多维数组的用途,您还可以考虑使用numpy,它为多维,齐次,未装箱的多维数组定义数组类型,这些数组类型在适用时可能更加高效,因此对于数值计算更可取。
sepp2k 2013年

1
@IfanIqbal是的,如果它包含至少一个元素,则可以。
sepp2k 2013年

136

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

实用答案

数组由类表示list(请参见参考,不要将它们与generator混合使用)。

查看用法示例:

# 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内幕是一个真实数组的包装,该数组包含对项目的引用。同样,基础数组会创建一些额外的空间。

其后果是:

  • 随机访问真的很便宜(arr[6653]与相同arr[0]
  • append 操作是“免费的”,同时有一些额外的空间
  • insert 操作费用昂贵

检查这张很棒的操作复杂性表

另外,请参见这张图片,在这里我试图显示数组,引用数组和链接列表之间的最重要区别: 数组,无处不在的数组


5
只需添加一下,就有一种非常酷的方法来在python中切割数组:[1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]结果将是[2, 3, 4, 5, 6, 7]
Anton Purin

2
我不时看到此职位的一些否定票。如果有人可以发表一个词为什么会很棒。谢谢。
安东·普林

2
您是真正的MVP。需要知道实际选择的“列表”设计,以便做出合理的编程决策。基本上,这就像C ++中的“向量”。谢谢!
Necro

这是一个真正的长答案,并且有很好的解释!
艾哈迈德(Ahmed)

我可以添加一些实用的符号进行比较,例如:a == b[:2]如果b的前两个元素等于数组a
Bruno L

124

您实际上并没有声明任何东西,但这是在Python中创建数组的方式:

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

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

现在可能您不想要数组,而是列表,但是其他人已经回答了。:)


10
对于标记为“初学者”的问题,这有点好笑,但并不是一个很好的答案。为了清楚起见:在Python中,您通常使用称为的数据类型list。Python有一种特殊的数据类型,称为an array,它更像C数组,很少使用。
steveha

63
不,但是其他所有人已经使用了列表。我认为指出数组也将是一个很好的答案。
Lennart Regebro

8
超级疯狂的道具为这个答案。我从事Python编程已经有多年了,直到最近才意识到存在一个与列表对象不同的实际Python数组对象。尽管数据结构非常相似,但数组限制了数组可以容纳的对象类型。好答案@LennartRegebro!
乔什·布朗

4
这应该是正确的答案列表和数组是两个不同的东西@LennartRegebro感谢
Mina Gabriel

您可能要使用数组而不是列表,这是有特定原因的。具体来说,如果您拥有一个名为myarray的充满数字的数组,则可以对其执行数学运算,并且这些运算将应用于其中的所有项。因此,如果执行myarray / 3,则内部的每个数字都将除以3。如果尝试对列表执行相同的操作,则会收到错误。因此,数组对于大型数字数据集更为有效。
马修

66

我认为您想要一个列表,其中前30个单元格已经填充。所以

   f = []

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

斐波那契数列就是一个可以使用它的例子。请参阅欧拉计画中的问题2


96
这是初始化列表的相当巴洛克的方式。试试吧f = [0] * 30
约翰·马钦

与@slehar anwer的a = range(10)不同吗?喜欢python,它的语法就是Zen。
m3nda 2015年

@ erm3nda nope:$ python3 Python 3.4.2 [...] >>> a = range(10)>>> print(a)range(0,10)>>>
arp

37

这是这样的:

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

4
由于这不是python数组而是python列表,因此将其称为“ my_list”会不会造成混淆?
马蒂斯·阿斯

4
这将创建一个列表,而不是一个数组。它们是不同的,并且在python中具有不同的属性。具体来说,您可以对数组执行数字运算,但不能对列表执行数值运算。
马修

21

对于计算,请使用如下的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。

在科学环境中大量使用。看到这里更多。


17

JohnMachin的评论应该是真正的答案。我认为所有其他答案只是解决方法!所以:

array=[0]*element_count

同意。除非小心地甚至将变量称为“数组”,否则都会产生纯粹的愤怒。为此,我还要补充一点,您可以类似地创建“多维数组”:x=[[0] * 10] * 10
Peter S Magnusson,

17

一些贡献表明python中的数组由列表表示。这是不正确的。Python array()在标准库模块arrayarray.array()”中具有独立的实现,因此将两者混淆是不正确的。列表是python中的列表,因此请谨慎使用所使用的术语。

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

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

list和之间有一个非常重要的区别array.array()。虽然这两个对象都是有序序列,但array.array()是有序均质序列,而列表是非均质序列。


16

您无需在Python中声明任何内容。您只需要使用它。我建议您从http://diveintopython.net之类的东西开始。


2
有时,您必须声明变量的类型:如果您以前没有使用过控件结构,则它在控件结构之外不存在,然后您将构造一个新变量。然后假设该变量是一个int,如果将其用作更复杂的类型,则会发生冲突。
清晰的时间2015年

@Clearer是的,使用函数有时需要声明它,有时在使用函数时要播放一些全局变量,并且不想在函数上写太多参数。
m3nda

不只是功能;一个简单的if语句可能会给您同样的问题。
清晰的

1
无论您使用哪种语言,编程都是关于声明的。类型声明是完全不同的故事
Outside_Box

尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
阿德里安·汤普金斯


11

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

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

其中可以采取一个元组,列表的形式,或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

并且输出仍然是相同的:

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

# array('f', [1.0, 2.0, 3.0])
# 2.0
# True

list的大多数方法也适用于数组,常见的方法是pop(),extend()和append()。

从答案和评论来看,似乎数组数据结构并不流行。我喜欢它,就像人们可能会更喜欢元组而不是列表一样。

数组结构比列表或np.array具有更严格的规则,这可以减少错误并简化调试,尤其是在处理数字数据时。

尝试将浮点数插入/附加到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和list:

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

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将在可能的情况下将条目转换为该数据类型:

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不是一个好主意。数组结构在这里很有用。list保留值的数据类型。

对于某些问题,我感到有些讨厌:数据类型在array()中指定为第一个参数,但是(通常)在np.array()中指定为第二个参数。:|

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

祝您探索愉快!

注意:数组的类型化和相当严格的性质更倾向于C而不是Python,并且通过设计,Python在其函数中没有许多特定于类型的约束。它的不受欢迎也给协作工作带来了积极的反馈,而替换它通常需要附加的[文件中x的int(x)]。因此,忽略数组的存在是完全可行和合理的。它不应该以任何方式阻碍我们大多数人。:D


8

这个怎么样...

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

6

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

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


4

我有一个字符串数组,并且需要一个相同长度的布尔值数组(初始化为True)。这就是我所做的

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

我在这里是因为我想要C声明:int count[26]={0}; 也许有更好的方法,但是bools上面的这种变体起作用了。 count=[0 for ii in range(26)]后来,我将其更改为count=[0]*26似乎更好。
user1683793

2

您可以创建列表并将其转换为数组,也可以使用numpy模块创建数组。以下是一些说明此问题的示例。Numpy还使使用多维数组更容易。

import numpy as np
a = np.array([1, 2, 3, 4])

#For custom inputs
a = np.array([int(x) for x in input().split()])

您还可以使用reshape函数将此数组整形为2X2矩阵,该函数将输入作为矩阵的尺寸。

mat = a.reshape(2, 2)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.