最合适的数据结构(Python)

时间:2010-11-12 11:52:14

标签: python arrays data-structures dictionary

我是Python新手,对于在我的代码中存储数据的“最佳”方式,可能是一个非常基本的问题。任何建议都非常感谢!

我有一个很长的.csv文件,格式如下:

Scenario,Year,Month,Value
1,1961,1,0.5
1,1961,2,0.7
1,1961,3,0.2
etc.

我的场景值从1到100,年份从1961年到1990年,月份从1到12.我的文件因此有100 * 29 * 12 = 34800行,每行都有一个相关值。

我想把这个文件读成某种Python数据结构,这样我就可以通过指定'Scenario','Year'和'Month'来访问'Value'。请问最好的方法是什么(或者有哪些选择)?

在我的脑海中,我认为这些数据是一种“数字长方体”,其中包含Scenario,Year和Month的轴,因此每个Value都位于坐标(Scenario,Year,Month)。出于这个原因,我很想尝试将这些值读入3D numpy数组,并使用Scenario,Year和Month作为索引。这是明智的做法吗?

我想我也可以创建一个字典,其中键是

str(Scenario)+str(Year)+str(Month)

这会更好吗?还有其他选择吗?

('更好'我想我的意思是'访问速度更快',尽管如果一种方法比另一种方法的内存密集程度要低得多,那么也很了解它。)

非常感谢!

4 个答案:

答案 0 :(得分:8)

我会使用元组词典。简单,快速,并且哈希表查找以检索单个值:

import csv

reader = csv.reader(open('data.csv', 'rb'))
header = reader.next()
data = {}

for row in reader:
    key = tuple([int(v) for v in row[:-1]])
    val = row[-1]
    data[key] = float(val)

# Retrieve a value
print data[1, 1961, 3]

答案 1 :(得分:4)

我会使用sqlite3将数据存储到磁盘。您将能够通过SQL查询读取完整的数据集或子集。然后,您可以将该数据加载到numpy数组或其他Python数据结构中 - 这对于任务来说最方便。

如果您确实选择使用sqlite,请注意sqlite具有TIMESTAMP数据类型。 将年份和月份合并为一个TIMESTAMP可能是个好主意。当您将TIMESTAMP读入Python时,可以告诉sqlite3自动将TIMESTAMP转换为datetime.datetime个对象,这将减少您必须编写的一些样板代码。它还可以更容易地形成SQL查询,这些查询要求两个日期之间的所有行。

答案 2 :(得分:2)

如果您每次都要通过不同的参数访问您的值,那么

sqlite是一个很好的选择。

如果情况并非如此,并且您将始终通过此三元组(方案,年,月)访问,则可以使用元组(不可变列表)作为键,将值作为值。

在代码中它看起来像:

d = {}
d[1, 1961, 12] = 0.5

或更通用的循环代码:

d[scenario, year, month] = value

稍后您可以通过以下方式访问它:

print d[scenario, year, month]

Python会自动为你创建元组。

答案 3 :(得分:0)

制作一本你所描述的字典词典。如果您需要数据作为数字,请在读取数据时将其转换为数字,并将数字存储在数字中。它会比使用字符串作为键更快。如果需要帮助代码,请告诉我。