如何在Python中声明和添加数组项

478
我试图在Python中添加元素到一个数组中。
我执行以下代码:
array = {}

然后,我尝试通过以下方式向该数组添加内容:

array.append(valueToBeInserted)

这似乎没有.append方法,那我该怎么向数组中添加元素呢?

9个回答

843

{} 表示一个空字典,而不是数组或列表。若要创建空列表或数组,请使用 []

初始化一个空列表的方法如下:

my_list = []
或者
my_list = list()

要向列表中添加元素,请使用append方法。

my_list.append(12)

使用extend函数将列表扩展以包括另一个列表中的元素。

my_list.extend([1,2,3,4])
my_list
--> [12,1,2,3,4]
从列表中删除元素,请使用remove
my_list.remove(2)

字典表示一个键值对的集合,也称为关联数组或映射。

要初始化一个空字典,请使用{}dict()

字典有键和值

my_dict = {'key':'value', 'another_key' : 0}

为了将一个字典扩展到另一个字典中,您可以使用update方法。

my_dict.update({'third_key' : 1})

从字典中删除一个值

del my_dict['key']

哦,好的,我理解为列表需要有键和值,但可能不是这样。 - AkshaiShah

64

如果您这样做:

array = {}

你正在创建一个字典,而不是一个数组。

如果你需要一个数组(在Python中被称为列表),你可以这样声明:

array = []

那么您可以像这样添加项目:

array.append('a')

1
吹毛求疵:你并没有“声明”任何东西。你只是让当前作用域中的名称引用一个字典/列表对象。 - user395760

19

在Python中,数组(称为list)使用[]符号表示。而{}用于dict(在其他语言中也称为哈希表、关联数组等),因此你无法对字典使用'append'。

如果你真正想要一个数组(列表),请使用:

array = []
array.append(valueToBeInserted)

16

为了完整起见,您也可以这样做:

array = []
array += [valueToBeInserted]
如果这是一个字符串列表,这个也可以工作:
array += 'string'

2
array = += [value]array.append(value) 之间会有性能影响吗? - Ng Sek Long

3

在一些语言,比如JAVA中,你可以使用花括号来定义数组,例如下面这样。但是在Python中,花括号有不同的含义:

Java:

int[] myIntArray = {1,2,3};
String[] myStringArray = {"a","b","c"};

然而,在Python中,花括号被用于定义字典,需要一个 key:value 赋值,如 {'a':1, 'b':2}

如果要定义一个数组(在Python中实际上被称为列表),可以使用以下方式:

Python:

mylist = [1,2,3]

或其他类似的例子,比如:
mylist = list()
mylist.append(1)
mylist.append(2)
mylist.append(3)
print(mylist)
>>> [1,2,3]

2

你也可以这样做:

array = numpy.append(array, value)

请注意,numpy.append() 方法返回一个新对象,因此如果您想修改初始数组,则必须编写:array = ...

绝对不是一个好主意使用 numpy 来附加到一个数组中,并在此过程中创建一个新对象。 - dwery

1

extend()通过单例扩展

这只是纯学术性质,但extend()方法也可以用于将值附加到列表中。只需将值放入元组/列表中,并通过它来扩展列表。

lst = []
value = 1
lst.extend((value,))    # <--- (value,) is a singleton tuple

正好,它比使用iadd+= [1])操作符追加一个单元素列表更快。实际上,它的性能与list.append相同。请查看这里的结果。此外,由于构建元组比构建列表更快,通过追加一个单元素元组来扩展也比追加一个单元素列表更快。
import timeit
t1 = min(timeit.repeat("lst.append(1)",    "lst = []"))   # 0.058306435006670654 
t2 = min(timeit.repeat("lst += [1]",       "lst = []"))   # 0.08136546600144356 
t3 = min(timeit.repeat("lst.extend((1,))", "lst = []"))   # 0.05731289298273623 
t4 = min(timeit.repeat("lst.extend([1])",  "lst = []"))   # 0.1094264310086146

然而,如果列表不是单个元素,iadd+=)在性能方面与list.extend相比非常有竞争力,如下面的实验所示。
t5 = min(timeit.repeat("lst += items",      "lst = []; items=[1, 2]"))  # 0.033552975044585764 
t6 = min(timeit.repeat("lst.extend(items)", "lst = []; items=[1, 2]"))  # 0.060612224973738194

Python的array模块

标准库还包含了array模块,它是对C数组的封装。与C数组一样,array.array对象只能保存单一类型的数据(在创建对象时需要指定类型代码),而Python的list对象可以保存任何类型的数据。它还定义了append/extend/remove等方法来操作数据。如果需要与C数组进行交互,这个模块非常有用。

import array

arr = array.array('f')  # initialize a float array
arr.append(1)           # append 1.0 to it (because its type is float)
arr.extend([2, 3])      # extend it by multiple values
lst = arr.tolist()      # convert to list

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


# `arr` only accepts floats; `lst` doesn't have that restriction
lst.append('string')       # <---- OK
arr.append('string')       # <---- TypeError: must be real number, not str
array.array 对象相对于 list 来说,其主要优势在于内存效率。从下面的示例中可以看出,arr 的内存消耗大约是 lst 的十分之一。
from pympler.asizeof import asizeof

lst = list(range(1_000_000))
arr = array.array('I', lst)

asizeof(lst)       # 40000048
asizeof(arr)       # 4000064

在特殊情况下,使用array.array对象可能比使用列表更快。Python官方网站上有一个关于这个的轶事,给出了一个例子。它是关于将整数列表转换为字符串的。现代版本可能如下所示(转换为array.array仍然比str.join更快)。
setup = "import array; lst=list(range(97,123))"
t8 = min(timeit.repeat("''.join(map(chr, lst))",                   setup))  # 2.106592966010794
t9 = min(timeit.repeat("array.array('B', lst).tobytes().decode()", setup))  # 1.2953468860359862

0

学习如何以最高效的方式创建数组不是个好主意吗?

创建并向数组中插入值非常简单:

my_array = ["B","C","D","E","F"]

但是,现在我们有两种方法将一个值插入到这个数组中:

慢速模式:

my_array.insert(0,"A") - 在零位置插入一个"A"时,会将所有值向右移动:

"A" --> "B","C","D","E","F"

快速模式:

my_array.append("A")

将值“A”添加到数组的最后位置,而不触碰其他位置。
"B","C","D","E","F", "A"

如果您需要展示排好序的数据,可以在必要的时候再展示。使用对您最有用的方式,但是了解每种方法的性能是很有趣的。


-3

我认为你们都错了,正确的做法是:

首先要定义数组:array = array[],然后才能往里面添加元素:array.append ["hello"]


6
定义数组的正确方式是 array = [] - Shai
1
你也可以使用 array = list() 来定义它。但是,使用 [] 将其定义为数组会提供仅适用于数组的特定功能,例如通过单个整数进行数组除法。例如:array/3 - Dalton Whyte
语法错误:无效的语法 - CodeGuru
在使用Python时,只需坚持使用列表即可。 - CodeGuru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接