你可能会使用许多不同类型的容器来实现你的目的,但是没有一个容器的名称是
array
。Python有一个名为
array
的模块,你可以从标准库中导入它,但是
array.array
类型对于你的目的来说太过受限(只能是一维数组,且元素类型必须是基本类型);有一个流行的第三方扩展库称为
numpy
,它具有强大的
numpy.array
类型,如果你已经下载并安装了这个扩展库,你可以使用它--但是由于你甚至没有提到
numpy
,我怀疑这不是你的意思;相关的内置类型是
list
和
dict
。我假设你想要任何类型的容器--但是如果你能在将来学会使用精确的术语,那将极大地帮助你和任何试图帮助你的人(当你指的是列表时,请说列表,当你确实指的是数组时,请仅使用数组,当你不确定要使用哪种容器时,请使用“容器”等)。
我建议您查看标准库中的csv
模块,以更稳健的方式读取数据,但这是一个单独的问题。让我们从您拥有包含5个字符串的列表的coords
列表开始,每个子列表都表示两个整数后跟三个浮点数的字符串。还需要指定另外两个关键方面...
您没有告诉我们的一个关键方面:列表是否按某种重要方式排序?特别地,您想保留某种重要顺序吗?由于您甚至没有提到任何一个问题,我将不得不假设一种或另一种方式,并且我将假设没有任何保证或有意义的顺序;但是,不允许重复(每个模拟/数据点号对只能出现一次)。
第二个关键问题是:每个模拟中的数据点数量是否按照递增顺序(0, 1, 2, ...)相同,还是这并不一定是这样的(而且顺便问一下,模拟本身是从0开始编号的吗?)再次强调,你没有提供关于规格的这个至关重要部分的线索 -- 注意到你只是“不告诉我们”关于如此显然关键的内容,导致可能帮助你的人们需要做出很多假设。不要让想要帮助你的人在黑暗中摸索:相反,学会以聪明的方式
提问-- 这将为你自己和潜在的帮助者节省大量时间,并提供更高质量和更相关的帮助,那么为什么不这样做呢?无论如何,被迫再次做出假设,我将不得不假设关于模拟编号以及每个模拟中的数据点数量一无所知。
基于这些假设,dict
成为用于外部容器的唯一合理结构:一个字典,其键是一个包含两个项目的元组,模拟编号和模拟中数据点编号。值也可以是元组(每个元组包含三个浮点数),因为每行似乎确实有恰好3个坐标。
基于所有这些假设...:
def make_container(coords):
result = dict()
for s, d, x, y, z in coords:
key = int(s), int(d)
value = float(x), float(y), float(z)
result[key] = value
return result
将所有重要代码放在 def
语句中(即作为可调用函数,可能带有适当的参数)始终是最好且最快的做法,因此我以这种方式呈现它。 make_container
返回一个字典,您可以使用仿真编号和数据点编号进行访问;例如,
d = make_container(coords)
print d[0, 0]
将打印 sim 0 的 dp 0 的 x、y、z,假设这样的 sim/dp 组合存在(如果不存在这样的组合,则会出现错误)。字典有许多有用的方法,例如将上面的打印语句更改为
print d.get((0, 0))
(是的,在这里您确实需要双括号——内部括号用于创建元组,外部括号用于将该元组作为其唯一参数调用get
),如果没有(0, 0)这样的sim/dp组合,您将看到None
,而不是得到异常。
如果您可以编辑您的问题,使您的规格更加精确(可能包括一些指示您计划如何使用结果容器以及我列出的各种关键方面),我可能会能够更好地微调此建议以更好地匹配您的需求和情况(其他回答者也可能如此!),因此我强烈建议您这样做——提前感谢您帮助我们帮助您!-)