2012-08-09 76 views
2

我试图在嵌套列表(雅虎财务的历史股票价格数据列表)中扣除值,我一直在遇到问题。我试图简单的减法(即高 - 低),但我无法实现这一点。我可能错过了关于列表性质的一些基本问题,但我很难过。在Python中嵌套列表的算术运算

我使用嵌套列表的一个例子:(顺序很重要)

[['2012-07-31', '16.00', '16.06', '15.81', '15.84', '13753800', '15.8'], 
['2012-07-30', '16.15', '16.15', '15.90', '15.98', '10187600', '15.9'], 
['2012-07-27', '15.88', '16.17', '15.84', '16.11', '14220800', '16.1'], 
['2012-07-26', '15.69', '15.88', '15.62', '15.80', '11033300', '15.8'], 
['2012-07-25', '15.52', '15.64', '15.40', '15.50', '15092000', '15.5'], 
['2012-07-24', '15.74', '15.76', '15.23', '15.43', '19733400', '15.4'], 
['2012-07-23', '15.70', '15.81', '15.59', '15.76', '14825800', '15.7'], 
['2012-07-20', '15.75', '15.94', '15.68', '15.92', '16919700', '15.9'], 
['2012-07-19', '15.71', '15.86', '15.64', '15.73', '15985300', '15.7'], 
...] 

我想减去第三“列” 4“列”和填充的结果另一个列表什么是实现这一目标的最佳方式?

回答

1

在原生的Python,如果你想离开嵌套列表(称之为“表”;在它的每个列表是“行”)完好,简洁,地道创建差异列表的方法是:

differences = [float(row[3]) - float(row[4]) for row in table] 

这样differences[i] == table[i][3] - table[i][4]

如果表中的数值数据会被其他代码使用,您可能希望将字符串转换为表内浮动:

table = [[r[0], float(r[1]), float(r[2]), 
     float(r[3]), float(r[4]), r[5], float(r[6])] for r in table] 

,这样的差异表将只是

创建
differences = [r[3] - r[4] for r in table] 
+0

这种方式正是我想要的方式。我应该更明确地说明数据会被其他代码使用。谢谢。 – TDL 2012-08-09 19:35:47

1

你的第一个问题是你的列表包含字符串而不是数字。如果您想减去需要将其转换为数字的数字(例如,在创建列表时使用float)。

看来你想要在组件上明智地加减数字,将数据视为一个包含行和列的表。为此,您应该使用numpy,这是为此设计的库。您可能还想看pandas,这是一个基于numpy构建的库,可为按行和列切分和切分数据提供强大的功能。 (如果您恰好从文件中读取数据,这些库还提供了一些工具,可让您读取,例如CSV文件,并将数据导入为数字和/或日期而不是字符串。)

+0

感谢您的评论。我一定会看熊猫。 – TDL 2012-08-09 18:49:31

3

您可以使用列表理解:

from decimal import Decimal 
result = [(row[0], Decimal(row[2]) - Decimal(row[3])) for row in data] 
+0

这是现在的工作。谢谢。 – TDL 2012-08-09 18:49:50

1

要做到这一点是使用numpy的最佳方式,蟒蛇从来没有设计有大量的数据工作,numpy是,在于它的子相当数量的实现使用编译为本地二进制文件的其他语言,并且可以使用加速线性代数库来加速计算。

继承人一个简单的例子:

>>> import numpy 
>>> values = numpy.random.rand(5, 5) # 5 by 5 matrix with random values 
>>> values[:, 3] - values[:, 2] # numpy is 0 index, so the fourth column is 3 and the third is 2