gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:22:08 24 4
gpt4 key购买 nike

我正在编写一个 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. 特征必须严格递增。 IE。允许使用“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)

关于python - 检查 Python 文件中一行最后一项的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11417413/

24 4 0
文章推荐: c - 堆栈周围变量损坏
文章推荐: python - 如何使用 xmpppy 发送数据?
文章推荐: javascript - 如何在 CSS 或 Javascript 中调整