如何在Python中将数据存储在二维数组中?

问题描述 投票:0回答:1

我正在编写一个 Python 求解器,以根据用户提供的信息找到化合物的经验公式。我写了以下代码:

n = int(input("Enter the number of elements: "))

data = [[""]*5]*n

for i in range(n):
    print("Enter the symbol of element, percentage and atomic number: ")
    for j in range(3):
        data[i][j] = input()

print(data)

运行代码后,我期望数据将按照我给程序的方式存储,但这是输出:

Output

请帮助我,因为我无法理解我的代码哪里出了问题。非常感谢!!!

python multidimensional-array
1个回答
0
投票

Python 没有原生的多维数组。 实现此目的的一种方法是在列表中使用列表 - 但是,由于列表开始为空,因此您不能简单地在列表内创建列表,并期望能够在

mylist[2][1]
存储项目 - 因为该元素确实还不存在。

因此,您必须首先创建“列表列表” - 一个简单的函数就可以做到这一点:

def array2d(m, n):
    return [[None for _ in range(n)] for _ in range(m)]

这与您尝试做的事情有类似的效果

data = [[""]*5]*n
- 但这会为所有 n 行重新使用在子表达式
[[""] * 5]
中创建的列表对象:所有行都将引用 same 内部列表,并且更改一个元素将立即影响所有行:

In [61]: n = 3

In [62]: data = [[""]*5]*n

In [63]: data[0][1] = 5

In [64]: data
Out[64]: [['', 5, '', '', ''], ['', 5, '', '', ''], ['', 5, '', '', '']]

使用两个

for
表达式可确保为每一行创建新列表。

另一种选择是,不使用列表的列表,而是使用字典。由于元组可以是字典键,因此您可以使用:

myarray = {}
myarray[3,2] = 5

print(myarray.get((3,2), 0))

它会起作用的。如果您使用

.get
方法而不是使用
myarray[3, 2]
检索元素,则可以为位置没有定义值的情况提供默认值(上例中的
0
)。

使用字典的缺点是没有边界检查,并且可以请求或将值放入任何位置。

对于这两种情况,在更复杂的使用中,实际上值得定义一个类,定义

__getitem__
__setitem__
方法:该类将在内部使用列表列表或字典,但它可以提供很多有用的东西,比如边界检查、默认值、矩阵乘法运算等等。

© www.soinside.com 2019 - 2024. All rights reserved.