ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

出于某种深不可测的原因,Python 将数组称为“列表”。 “每个人都知道这叫什么,所以我们要叫它别的东西”语言设计学院。这是一个特别糟糕的名称选择,因为它看起来像一个链表而不是一个数组。
@Glenn Maynard:可能是因为在类 C 语言中,数组是固定长度的,而 Python 列表不是。它更像是 C++ 中的 STL 向量或 Java 中的 ArrayList。
它被称为列表,因为它是一个列表。 [A(), 1, 'Foo', u'öäöäö', 67L, 5.6]。一个列表。数组是“计算机内存中等距地址的项目排列”(维基百科)。
普遍理解的术语“数组”没有任何内容暗示固定长度或任何内容。这些只是 C 对数组的特定实现的限制。 Python 列表是等距的(指向对象的指针,在内部),否则 __getitem__ 不会是 O(1)。
@Glenn,来自 en.wikipedia.org/wiki/Array_data_structure :“数组数据结构的元素必须具有相同的大小”(对于 Python 的数组是正确的,对于 Python 列表不是正确的)和“一组有效的索引元组和元素的地址(因此元素寻址公式)通常在使用数组时是固定的”(在 Python 中对于列表或数组都不是这样)。

Z
Zanon
variable = []

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

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

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


是否可以像在 JavaScript 中那样初始化数组的内容? (例如,作为 variable = ["Hi", "Hello"];?)
那么你将如何声明一个多维数组(例如,一个二维数组?)
@AndersonGreen 正如我所说,Python 中没有变量声明之类的东西。您可以通过获取一个空列表并将其他列表放入其中来创建一个多维列表,或者,如果列表的维度在写入时已知,您可以将其写为如下文字:my_2x2_list = [[a, b], [c, d]]。根据您需要多维数组的用途,您还可以考虑使用 numpy,它为多维、同类、未装箱数组定义数组类型,在适用的情况下效率更高,因此它们更适合数值计算.
@IfanIqbal 是的,如果它包含至少一个元素,则可以。
它的正式名称为列表
A
Anton

这是 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] 相同)

附加操作是“免费的”,而一些额外的空间

插入操作很昂贵

检查此awesome table of operations complexity

https://i.stack.imgur.com/B2Q7K.png


补充一点,在 python 中切割数组有一种非常酷的方法:对于 [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2] 结果将是 [2, 3, 4, 5, 6, 7]
我不时看到一些反对这个帖子的投票。如果有人可以发布一个词为什么会很棒。谢谢。
你是真正的MVP。需要了解“列表”的实际选择设计,以便做出合理的编程决策。基本上它就像 C++ 中的“向量”。谢谢!
这是一些真正的长答案,有一些很好的解释!
我可以添加实际的符号进行比较,例如:如果 b 的前 2 个元素等于数组 a 的值,a == b[:2] 返回 True
N
Nicholas Riley

您实际上并没有声明事物,但这就是您在 Python 中创建数组的方式:

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

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

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


这有点有趣,但对于标记为“初学者”的问题并不是一个很好的答案。明确一点:在 Python 中,您通常使用称为 list 的数据类型。 Python 有一种特殊用途的数据类型,称为 array,它更像是 C 数组,很少使用。
不,但其他人都已经使用了一个列表。我认为指出也有数组是一个很好的答案。
这个答案的超级疯狂道具。我已经用 Python 编程多年,直到最近才意识到有一个实际的 Python 数组对象与列表对象不同。虽然数据结构非常相似,但数组限制了数组可以保存的对象类型。很好的答案@LennartRegebro!
这应该是正确的答案列表和数组是两个不同的东西@LennartRegebro 谢谢
您可能想要使用数组而不是列表是有特定原因的。具体来说,如果您有一个名为 myarray 的充满数字的数组,您可以对其执行数学运算,这些运算将应用于其中的所有项目。所以,如果你执行 myarray/3,里面的每个数字都除以 3。如果你试图用一个列表做同样的事情,你会得到一个错误。因此,数组对于大型数字数据集更有效。
l
limitcracker

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

   f = []

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

可以使用它的一个例子是斐波那契数列。请参阅 Project Euler 中的问题 2


这是一种相当巴洛克式的初始化列表的方式。请改用 f = [0] * 30
与@slehar anwer 中的 a = range(10) 不同吗?喜欢 python,它的语法和禅。
@erm3nda 不:$ python3 Python 3.4.2 [...] >>> a = range(10) >>> print (a) range(0, 10) >>>
p
pradyunsg

这是如何:

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

既然这不是 python 数组而是 python 列表,那么称它为“my_list”会不会更容易混淆?
这会创建一个列表,而不是一个数组。它们是不同的,并且在 python 中具有不同的属性。具体来说,您可以对数组执行数值运算,但不能对列表执行。
该声明不回答发布的问题。
G
Gavriel Cohen

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


c
csabinho

JohnMachin's comment 应该是真正的答案。在我看来,所有其他答案只是解决方法!所以:

array=[0]*element_count

同意。除了小心地调用变量“数组”,或者得到纯粹的愤怒。为此,我还要补充一点,您可以类似地创建“多维数组”:x=[[0] * 10] * 10
是的,这仍然是一个列表。使用 type() 函数为您自己确定。
h
hussam

一些贡献表明 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']

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


b
bayer

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


有时您必须声明变量的类型:如果您以前不使用它,控制结构,它在控制结构之外不存在,然后您将构造一个新变量。然后假设该变量是一个 int,如果将其用作更复杂的类型,则会发生冲突。
@Clearer是的,使用函数有时需要声明它,有时在使用函数时播放一些全局变量并且不想在函数上写太多参数。
这不仅仅是功能;一个简单的 if 语句可能会给你同样的问题。
编程就是声明,无论您使用哪种语言。类型声明是完全不同的故事
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。
n
non sequitor

我通常只会做 a = [1,2,3] 这实际上是 list 但对于 arrays 看看这个正式的 definition


C
Community

要添加到 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

大多数列表方法也适用于数组,常见的有 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 和列表:

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


k
kontinuity

这个怎么样...

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

c
camh

继 Lennart 之后,还有实现同构多维数组的 numpy


C
Colonel Panic

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

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

P
Pedro A. Aranda

我有一个字符串数组,需要一个相同长度的布尔数组,初始化为 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,这似乎更可取。
S
Stephen Rauch

您可以创建列表并将它们转换为数组,也可以使用 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)

t
tonyb
# This creates a list of 5000 zeros
a = [0] * 5000  

您可以使用 [n] 表示法读取和写入此列表中的任何元素,就像使用数组一样。

它似乎确实具有与数组相同的随机访问性能。我不能说它是如何分配内存的,因为它还支持不同类型的混合,包括字符串和对象(如果需要)。