2

我试图减去嵌套列表(来自雅虎财经的历史股价数据列表)中的值,但我遇到了问题。我正在尝试简单的减法(即高 - 低),但我无法实现这一点。我可能遗漏了一些关于列表本质的基本知识,但我很难过。

我正在使用的嵌套列表的示例:

[['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

4 回答 4

3

您可以使用列表推导:

from decimal import Decimal
result = [(row[0], Decimal(row[2]) - Decimal(row[3])) for row in data]
于 2012-08-09T18:21:00.607 回答
1

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

似乎您想按分量添加和减去数字,将您的数据视为具有行和列的表。为此,您应该使用numpy,这是为此设计的库。您可能还想查看pandas,它是一个基于 numpy 的库,可提供强大的功能,用于按行和列对数据进行切片和切块。(如果您碰巧从文件中读取数据,这些库还提供了一些工具,可以让您读取,例如 CSV 文件,并将数据作为数字和/或日期而不是字符串导入。)

于 2012-08-09T18:19:13.267 回答
1

最好的方法是使用numpy,python 从未设计用于处理大量数据,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
于 2012-08-09T18:27:50.480 回答
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]
于 2012-08-09T18:38:30.413 回答