如何在Python中声明数组?
我在文档中找不到对数组的任何引用。
__getitem__
将不是O(1)。
如何在Python中声明数组?
我在文档中找不到对数组的任何引用。
__getitem__
将不是O(1)。
Answers:
variable = []
现在variable
引用一个空列表*。
当然,这是分配,而不是声明。在Python中,没有办法说“此变量不应引用列表以外的任何东西”,因为Python是动态类型的。
*默认的内置Python类型称为list,而不是数组。它是一个任意长度的有序容器,可以容纳异构对象集合(它们的类型无关紧要,可以自由混合)。请勿将其与array
模块混淆,后者提供的类型更接近C array
类型。内容必须是同质的(所有类型都相同),但是长度仍然是动态的。
variable = ["Hi", "Hello"];
?)
my_2x2_list = [[a, b], [c, d]]
。根据您需要的多维数组的用途,您还可以考虑使用numpy
,它为多维,齐次,未装箱的多维数组定义数组类型,这些数组类型在适用时可能更加高效,因此对于数值计算更可取。
这是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
操作费用昂贵检查这张很棒的操作复杂性表。
[1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]
结果将是[2, 3, 4, 5, 6, 7]
a == b[:2]
如果b的前两个元素等于数组a
您实际上并没有声明任何东西,但这是在Python中创建数组的方式:
from array import array
intarray = array('i')
有关更多信息,请参见数组模块:http : //docs.python.org/library/array.html
现在可能您不想要数组,而是列表,但是其他人已经回答了。:)
list
。Python有一种特殊的数据类型,称为an array
,它更像C数组,很少使用。
f = [0] * 30
。
对于计算,请使用如下的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。
在科学环境中大量使用。看到这里更多。
JohnMachin的评论应该是真正的答案。我认为所有其他答案只是解决方法!所以:
array=[0]*element_count
x=[[0] * 10] * 10
您无需在Python中声明任何内容。您只需要使用它。我建议您从http://diveintopython.net之类的东西开始。
为了增加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
我有一个字符串数组,并且需要一个相同长度的布尔值数组(初始化为True)。这就是我所做的
strs = ["Hi","Bye"]
bools = [ True for s in strs ]
int count[26]={0};
也许有更好的方法,但是bools
上面的这种变体起作用了。 count=[0 for ii in range(26)]
后来,我将其更改为count=[0]*26
似乎更好。
您可以创建列表并将其转换为数组,也可以使用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)