我正在尝试编写一个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))
答案 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)):