Python:访问列表中的前一个元素" TypeError:list indices必须是整数,而不是元组"

时间:2014-11-22 16:03:05

标签: python list tuples

我正在尝试编写一个Python程序来浏览两个列表x[ ]y[ ]。列表中的元素是从文件中读取的。每个x[ ]元素都有一个对应的y[ ]元素。 x[ ]y[ ]在图表上相互绘制(已绘制,但删除了绘图,因为此代码不需要)。

我想将图表整合到x[ ]上,并创建另一个列表cumulative[ ]。我正在尝试获取cumulative[ ]的第n个元素来保存第一个x[ ]元素和第n个x[ ]元素之间的整数值。

在追加cumulative[ ]之前,我尝试声明引用第i个x[ ]y[ ]元素和第i-1个元素的变量。这是出现以下错误消息的地方:

Traceback (most recent call last):
  File "C:/Python27/andy_experiments/cumulate1", line 39, in <module>
    xprevious = x[i - 1]
TypeError: unsupported operand type(s) for -: 'tuple' and 'int' "

我查看了其他人正在使用的Python代码来访问列表中的上一个/下一个值,我无法弄清楚为什么我的代码无法执行此操作。

我的代码:

import matplotlib.pyplot as plt

x = []
y = []
cumulative = []

readFile = open('data_03.txt', 'r')
sepFile = readFile.read().split('\n')

readFile.close()

count = 0

# The code was originally used to plot data, hence "plotPair" (line in the file)
for plotPair in sepFile:
    if plotPair.startswith("!"):
        continue
    if plotPair.startswith(" !"):
        continue
    if plotPair.startswith("READ"):
        continue
    if plotPair.startswith("NO"):
        continue
    if plotPair == "\n":
        continue
    if not plotPair.strip():
        continue
    else:
        xAndY = plotPair.split('    ')
        x.append(float(xAndY[0]))
        y.append(float(xAndY[3]))

for i in enumerate(zip(x, y)):
    count = count + 1
    if count < 2:
        continue
    else:
        xprevious = x[i - 1] # this is line 41, where the (first) error lies
        xnow = [i]
        yprevious = y[i - 1]
        ynow = y[i]
        cumulative.append((xnow - xprevious)*(ynow - yprevious))

2 个答案:

答案 0 :(得分:2)

enumerate()产生一系列元组;索引和包装的iterable中的元素。你正在尝试使用那个元组;对于zip(x, y)序列,表示您获得的序列为(0, (x[0], y[0])),然后是(1, (x[1], y[1]))等。

将元组解压缩到索引和x, y对中:

for i, (xval, yval) in enumerate(zip(x, y)):
    if i > 0:
        xprevious = x[i - 1]
        yprevious = y[i - 1]
        cumulative.append((xval - xprevious) * (yval - yprevious))

我也用count < 2的测试替换了i测试。

您可以通过分配更轻松地跟踪前一对:

previous = None
for xval, yval in zip(x, y):
    if previous:
        xprevious, yprevious = previous
        cumulative.append((xval - xprevious) * (yval - yprevious))
    previous = xval, yval

答案 1 :(得分:1)

您需要解压缩enumerate返回的元组(index, value)。例如:

>>> x = [1,2,3,4]
>>> y = [2,4,6,8]

for index, pair in enumerate(zip(x,y)):
    print(index)

0
1
2
3

您当前的索引使用这些元组作为索引,这就是错误告诉您的内容

for i in enumerate(zip(x,y)):
    print(i)

(0, (1, 2))
(1, (2, 4))
(2, (3, 6))
(3, (4, 8))

您可以修改代码的最快变化是将for循环更改为

for i, pair in enumerate(zip(x, y)):