2017-05-29 36 views
0

我试图读取包含x,y值对的文件,例如调用listPts [0]时的556.3 439.1。但是,当我尝试获取k,即listPts中的最小y值时,出现以下错误。builtins.ValueError:'5'不在列表中

builtins.ValueError: '5' is not in list

'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

所以发生了什么事是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)