我正在编写一个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是这些值中最大的一个,所以这是我想要的值。我正在查看一个文件,每个行可能有数千个功能,还有数十万行。
该文件满足以下属性:
- 功能必须严格增加。即允许"3:v1 4:v2",但不允许"3:v13:v2"
- 这些特征不一定是连续的,可以跳过。在我给出的第一个例子中,第一行按连续顺序(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)