给定一个矩阵文件并将第一列用作python字典的键(称之为docid),我应该如何读取该文件,使其在密钥不在运行状态时停止,即
if docid-1 > previous_docid
或if docid < previd
我一直在做下面的代码,但看起来有点冗长,有没有其他方法可以产生相同的输出? (注意:解决方案需要处理最高可达20 GB的矩阵文件。为了代码片段,我提供了一个小数据集)
text = '''0 1 1
0 2 1
1 3 1
1 7 1
2 5 4
2 4 6
2 9 8
3 5 7
3 9 8
3 10 9
9 2 9
9 8 3
3 9 4'''
from collections import defaultdict
docs = defaultdict(list)
previd = -1
for line in text.split('\n'):
docid, termid, val = map(int,line.split())
if docid < previd or docid-1 > previd:
print line
break
previd = docid
docs[docid].append((termid,val))
for i in docs:
print i, docs[i]
答案 0 :(得分:1)
我看不到任何简化,因为过滤条件取决于前一个元素(使潜在的过滤迭代复杂)。我不认为你的代码很复杂,但你可以定义一个特殊的遍历:
def read_text(text):
for line in text.split('\n'):
docid, termid, val = map(int,line.split())
if docid < previd or docid-1 > previd:
print line # I guess this is a debug feature
return # or raise Exception("line not in running order", line)
yield (docid, termid, val)
并在您的主要代码中:
for docid, termid, val in read_text(text):
docs[docid].append((termid,val))
而不是text.split('\n')
可能open('myfile','r')
更有效率。
for line in open('myfile','r'):
do_something(line)