检查Python文件中一行最后一项的有效方法



我正在编写一个Python脚本,它接收一个(可能很大的)文件。以下是一个格式化输入文件的方法示例:

class1 1:v1 2:v2 3:v3 4:v4 5:v5
class2 1:v6 4:v7 5:v8 6:v9
class1 3:v10 4:v11 5:v12 6:v13 8:v14
class2 1:v15 2:v16 3:v17 5:v18 7:v19

其中class1和class2是某个数字,例如1和-1。(好奇的用户可能会注意到这是一个与LIBSVM相关的文件,但在这种情况下不需要知道软件。)值v1、v2、。。。,v19表示任何整数或浮点值。显然,就总行数和每行长度而言,我的文件会比这个大得多,这就是为什么我担心这里的效率。

我试图检查冒号左的最大值是什么。在LIBSVM中,这些被称为"特征",在这里总是整数。例如,在我上面概述的示例中,第1行的最大特征是5。第2行以6为最大特征,第3行以8为最大特征;最后,第4行以7为最大特征。由于8是这些值中最大的一个,所以这是我想要的值。我正在查看一个文件,每个行可能有数千个功能,还有数十万

该文件满足以下属性:

  1. 功能必须严格增加。即允许"3:v1 4:v2",但不允许"3:v13:v2"
  2. 这些特征不一定是连续的,可以跳过。在我给出的第一个例子中,第一行按连续顺序(1,2,3,4,5)具有其特征,并跳过特征6、7和8。其他3条线的特征不按连续顺序排列。这没关系,只要这些功能正在严格增加

现在,我的方法是检查每一行,用空格将每一行分开,用冒号将最后一项分开,然后检查特征值。接下来,我将执行一个过程来检查最大的featureNum。

file1 = open(...)
max = 0
for line in file1:
    linesplit = line.rstrip('n').split(' ')
    val = linesplit[len(linesplit) - 1]
    valsplit = val.split(':')
    featureNum = valsplit[0]
    if (featureNum > max):
        max = featureNum
 print max
 file1.close()

但我希望有一种更好或更有效的方法来实现这一点,例如,通过只获取换行符前面的术语来分析文件的某种方法(也许是为了避免读取所有行?)。我是Python的新手,所以如果我错过了一些显而易见的东西,我也不会感到惊讶。

可能的参考:http://docs.python.org/library/stdtypes.html

由于您不关心一行中的所有功能,而只关心最后一行,因此不需要拆分整行。我不知道这是否真的更快,但你需要计时看看。这绝对不像把整条线都分开那么像Python。

def last_feature(line):
    start = line.rfind(' ') + 1
    end = line.rfind(':')
    return int(line[start:end])
with open(...) as file1:
    largest = max(last_feature(line) for line in file1)

相关内容

  • 没有找到相关文章

最新更新