如何在Python中声明数组?
我在文档中找不到任何对数组的引用。
答案 0 :(得分:312)
variable = []
现在variable
引用一个空列表 * 。
当然这是一项任务,而非宣言。在Python中没有办法说“这个变量永远不应该引用除列表以外的任何东西”,因为Python是动态类型的。
* 默认的内置Python类型称为 list ,而不是数组。它是一个任意长度的有序容器,可以容纳异质的对象集合(它们的类型无关紧要,可以自由混合)。这不应与array
module混淆,{{3}}提供更接近C array
类型的类型;内容必须是同质的(所有相同的类型),但长度仍然是动态的。
答案 1 :(得分:112)
您实际上并未声明事物,但这是您在Python中创建数组的方式:
from array import array
intarray = array('i')
有关详细信息,请参阅阵列模块:http://docs.python.org/library/array.html
现在可能你不想要一个数组,而是一个列表,但其他人已经回答了这个问题。 :)
答案 2 :(得分:99)
这是Python中令人惊讶的复杂主题。
数组由类list
表示(请参阅reference,不要将它们与generators混合)。
查看用法示例:
# 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
操作费用昂贵答案 3 :(得分:63)
我认为你(意味着)想要一个已填充前30个单元格的列表。 所以
f = []
for i in range(30):
f.append(0)
可以使用它的一个例子是Fibonacci序列。 请参阅Project Euler
中的问题2答案 4 :(得分:36)
这是:
my_array = [1, 'rebecca', 'allard', 15]
答案 5 :(得分:15)
你没有在Python中声明任何内容。你只需要使用它。我建议您从http://diveintopython.net开始。
答案 6 :(得分:13)
进行计算时,请使用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。很多用于科学环境。有关详情,请参阅here
答案 7 :(得分:12)
我通常会a = [1,2,3]
list
实际上是arrays
,但对于{{1}},请查看此正式definition
答案 8 :(得分:12)
一些贡献表明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']
列表和array.array()
之间有一个非常重要的区别。虽然这两个对象都是有序序列,但array.array()是有序的齐次序列,而列表是非同构序列。
答案 9 :(得分:10)
要添加到Lennart的答案,可以像这样创建一个数组:
from array import array
float_array = array("f",values)
其中 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
列表的大多数方法也适用于数组,常见 一些是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
保持数组中的整数值(例如索引列表) 因此,form可能会阻止" TypeError:list索引必须是整数,而不是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])
令人讨厌的是,将一个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 List vs. Array - when to use?
玩得开心!
注意:数组的类型和相当严格的性质更倾向于C而不是Python,并且通过设计,Python在其函数中没有许多特定于类型的约束。它的不受欢迎也会在协同工作中产生积极的反馈,而替换它主要涉及额外的[int(x)for x in file]。因此,忽略阵列的存在是完全可行和合理的。它不应该以任何方式妨碍我们大多数人。 :d
答案 10 :(得分:7)
这个怎么样......
>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6
答案 11 :(得分:7)
JohnMachin's comment应该是真正的答案。 在我看来,所有其他答案都只是解决方法! 所以:
array=[0]*element_count
答案 12 :(得分:6)
继Lennart之后,还有numpy实现了同构多维数组。
答案 13 :(得分:6)
Python称它们为lists。您可以使用方括号和逗号编写列表文字:
>>> [6,28,496,8128]
[6, 28, 496, 8128]
答案 14 :(得分:4)
我有一个字符串数组,需要一个与True相同长度的布尔值的数组。这就是我所做的
strs = ["Hi","Bye"]
bools = [ True for s in strs ]
答案 15 :(得分: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()])
您还可以使用重塑函数将此数组重新整形为2X2矩阵,该函数将输入作为矩阵的维度。
mat = a.reshape(2, 2)