Python中的二维数组

51

我想知道如何在Python中声明一个二维数组。

arr = [[]]

arr[0].append("aa1")
arr[0].append("aa2")
arr[1].append("bb1")
arr[1].append("bb2")
arr[1].append("bb3")

前两个赋值语句正常工作。但是当我尝试执行arr[1].append("bb1")时,出现以下错误:

IndexError: list index out of range.

我在尝试声明2维数组方面有什么愚蠢的地方吗?

编辑:
但我不知道数组中元素的数量(包括行和列)。

12个回答

88
你无需在Python中“声明”数组或任何其他变量。你只需要将其赋值给一个(新的)变量即可。如果你想要一个多维数组,只需要将一个新的数组作为数组元素添加即可。

在Python中,你不需要“声明”任何类型的变量,包括数组。你只需要简单地将其赋值给一个新的变量即可。如果你需要创建一个多维数组,只需要将新的数组作为数组元素添加即可。

arr = []
arr.append([])
arr[0].append('aa1')
arr[0].append('aa2')
或者
arr = []
arr.append(['aa1', 'aa2'])

7
“应该使用arr.append(...)而不是arr [0] = ...,以避免出现IndexError:list assignment index out of range错误吗?” - Bruno

81

Python 中并没有所谓的多维数组,你所拥有的是一个包含其他列表的列表。

>>> arr = [[]]
>>> len(arr)
1
你所做的是声明一个包含一个列表的列表。因此arr[0]包含一个列表,但arr[1]未定义。
你可以按照以下方式定义一个包含两个列表的列表:
arr = [[],[]]

或者你可以使用以下方法来定义一个更长的列表:

>>> arr = [[] for _ in range(5)]
>>> arr
[[], [], [], [], []]

不应该这样做:

arr = [[]] * 3

由于这样将相同的列表放入容器列表的三个位置:

>>> arr[0].append('test')
>>> arr
[['test'], ['test'], ['test']]

2
列表推导式中的下划线是什么作用? - Kris Harper
3
我们需要在列表推导式中定义一个变量,所以我们可以这样写:arr = [[] for i in range(5)],但是惯例上会将不使用的变量命名为下划线(_)。尽管在交互式Python REPL中,变量“_”存储着最后一个表达式的结果。 - David Webb
"天哪,这个 []*3 的东西是导致我在 HackerRank 代码中所有问题的原因。我已经用 Python 编程4年了,但似乎仍有很多需要学习的地方!" - Ayush Mandowara

24

你使用的不是数组,而是列表(的列表)。

如果你想在Python中使用多维数组,可以使用Numpy数组。你需要预先知道形状。

例如:

 import numpy as np
 arr = np.empty((3, 2), dtype=object)
 arr[0, 1] = 'abc'

7
您尝试向数组的第二个元素添加内容,但该元素不存在。请先创建它。
arr = [[]]

arr[0].append("aa1")
arr[0].append("aa2")
arr.append([])
arr[1].append("bb1")
arr[1].append("bb2")
arr[1].append("bb3")

3
我们可以按以下方式动态创建多维数组:
从标准输入读取x和y的值,创建2个变量:
 print("Enter the value of x: ")
 x=int(input())

 print("Enter the value of y: ")
 y=int(input())

使用以下代码创建一个具有初始值为0或任何其他值的列表数组。
z=[[0 for row in range(0,x)] for col in range(0,y)]

创建数组数据的行数和列数。

从标准输入读取数据:

for i in range(x):
         for j in range(y):
             z[i][j]=input()

显示结果:

for i in range(x):
         for j in range(y):
             print(z[i][j],end=' ')
         print("\n")

或者使用另一种方法动态显示创建的数组,如下所示:
for row in z:
     print(row)

2

您可以先将元素附加到初始化数组中,然后为方便起见,可以将其转换为numpy数组。

import numpy as np
a = [] # declare null array
a.append(['aa1']) # append elements
a.append(['aa2'])
a.append(['aa3'])
print(a)
a_np = np.asarray(a) # convert to numpy array
print(a_np)

请不要在您的答案中只写代码...请解释它是如何解决问题的。 - Studocwho

2
在Python中构建多维列表时,我通常使用类似于ThiefMaster的解决方案,但不是将项附加到索引0,然后将项附加到索引1等,而是始终使用索引-1,它自动成为数组中最后一项的索引。
例如:
arr = []

arr.append([])
arr[-1].append("aa1")
arr[-1].append("aa2")

arr.append([])
arr[-1].append("bb1")
arr[-1].append("bb2")
arr[-1].append("bb3")

将产生你需要的二维数组(实际上是一个列表的列表)。


1
a = [[] for index in range(1, n)]

1

针对竞技编程

1)输入值到一个二维数组中

row=input()
main_list=[]
for i in range(0,row):
    temp_list=map(int,raw_input().split(" "))
    main_list.append(temp_list)

2) 用于显示二维数组

for i in range(0,row):
    for j in range(0,len(main_list[0]):
        print main_list[i][j],
        print

1

以上方法在我的for循环中不起作用,我想将数据从一个二维数组传输到一个新的数组,在if条件下。这种方法可以实现。

a_2d_list = [[1, 2], [3, 4]]
a_2d_list.append([5, 6])
print(a_2d_list)

OUTPUT - [[1, 2], [3, 4], [5, 6]]

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