簡體   English   中英

檢查Python文件中行的最后一項的有效方法

[英]Efficient way to check last term of a line in Python file

我正在編寫一個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:v1 3: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

由於您不必關心一行中的所有功能,而只關心最后一個,因此您無需拆分整行。 我不知道這實際上是否更快,您需要計時並看看。 它絕對不像拆分整行的Pythonic。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM