当我调用listPts [0]时,我正在尝试读取包含x,y值对的文件,例如556.3 439.1。但是,当我尝试获取k(listPts中的最小y值)时,我收到以下错误。
builtins.ValueError:'5'不在列表中
'5'指的是什么?我只是希望能够打印像439.1这样的y值。
def main():
listPts = readDataPts('Set_A.dat', 2000)
k = listPts.index(min(listPts, key=operator.itemgetter(1))[0])
print(k)
答案 0 :(得分:0)
正如listPts.index(x)
所发生的那样,listPts
会在索引x
处返回listPts.index('5')
的值。
您的错误发生是因为您尝试获取'5'
。即您正在尝试使用字符串获取索引。此外,因为它只获得'556.3'
而不是readDataPts
,我想你的556.3 439.1
556.3 439.1
556.3 439.1
556.3 439.1
没有返回正确的数据。
对于看起来像这样的文件:
import operator
def readDataPts(filename):
listPts = []
with open(filename, 'r') as f:
for line in f:
str_vals = line.split(" ")
listPts.append([float(str_vals[0]), float(str_vals[1])])
return listPts
listPts = readDataPts('test.dat')
k = min(listPts, key=operator.itemgetter(1))[1]
您可以编写如下相应的代码:
y
此代码正确解析文件(将字符串数转换为浮点数),并返回最小index
值。您会注意到您根本不需要min
方法,并且由于[x,y]
返回最小的1
对,您还希望最小的索引为0
而非min
。
如果您的文件非常大(太大而无法进入内存),您可以使用生成器直接向import operator
def readDataPts(filename):
listPts = []
with open(filename, 'r') as f:
for line in f:
str_vals = line.split(" ")
yield [float(str_vals[0]), float(str_vals[1])]
k = min(readDataPts('test.dat'), key=operator.itemgetter(1))[1]
print(k)
生成行,这将避免读取整个文件:
a.type == 1