我正在尝试使用Python确定数据表中Z的最佳值。当Y值的差异大于10时,出现Z的最优值。在我的代码中,我将每个条目的元素分配到一个类中。因此,为了确定最佳值,我需要访问先前计算的Y值并从新值中减去它。这一切对我来说都很麻烦,所以如果你知道一种更好的方法我可以进行这些类型的计算,请告诉我。我的样本数据表是:
X Y Z
1 5 10
2 3 20
3 4 30
4 6 40
5 12 50
6 12 60
7 34 70
8 5 80
到目前为止我的代码是:
class values:
def __init__(self, X, Y, Z):
self.X = X
self.Y = Y
self.Z = Z
#Diff = Y2 - Y1
#if Diff > 10:
#optimum = Z
#else:
#pass
#optimum
valueLst = []
f = open('sample.txt','r')
for i in f:
X = i.split('\t')[0]
Y = i.split('\t')[1]
Z = i.split('\t')[2]
x = values(X,Y,Z)
valueLst.append(x)
我想要实现的操作示例如下表所示。 Y值的差异在第三列中计算,当差值为22,即Z值为70时,我想返回Z的值。
1 2 10
2 3 1 20
3 4 1 30
4 6 2 40
5 12 6 50
6 12 0 60
7 34 22 70
8 35 1 80
非常感谢任何帮助。
答案 0 :(得分:1)
class
似乎有点矫枉过正。为什么不是(x, y, z)
元组的列表?
valueLst = []
for i in f:
valueLst.append(tuple(i.split('\t')))
然后,您可以确定y
值之间的差异,并从与最大增量对应的3元组中获取最后一项z
- y
:
yDiffs = [0] + list(valueLst[i][1] - valueLst[i-1][1]
for i in range(1, len(valueLst)))
bestZVal = valueLst[yDiffs.index(max(yDiffs))][2]
答案 1 :(得分:0)
首先,您可以将列放入列表数据结构中:
f = open('sample.txt','r')
x, y, z = [], [], []
for i in f:
ix, iy, iz = map(int, i.split('\t')) # the map function changes each number
# to an integer from a string
y.append(iy)
z.append(iz)
如果有数据结构,可以将它们一起使用以获得所需的其他数据结构。
然后你可以从第二个y开始得到每个差异:
differences = [y[i] - y[i+1] for i in range(1,len(y))]
你想要的是z在与最大差异相同的索引处,所以:
maxIndex = y.index(max(differences))
answer = z[maxIndex]
答案 2 :(得分:0)
鉴于包含此内容的文件:
1 5 10
2 3 20
3 4 30
4 6 40
5 12 50
6 12 60
7 34 70
8 5 80
您可以阅读该文件并转换为元组列表,如下所示:
data=[]
with open('value_list.txt') as f:
for line in f:
x,y,z=map(int,line.split())
data.append((x,y,z))
print(data)
打印:
[(1, 5, 10), (2, 3, 20), (3, 4, 30), (4, 6, 40), (5, 12, 50), (6, 12, 60), (7, 34, 70), (8, 5, 80)]
然后,您可以使用该数据使用列表推导查找符合条件的元组。在这种情况下y-previous y>10
:
tgt=10
print([data[i][2] for i in range(1,len(data)) if data[i][1]-data[i-1][1]>tgt])
[70]
答案 3 :(得分:0)
跳过元组x,y和z的构建
diffs = [curr-prev for curr, prev in izip(islice(y, 1, None), islice(y, len(y)-1))]
max_diff = max(diffs)
Z = y[diffs.index(max_diff)+1]