我有以下文本文件:
abstract 233:1 253:1 329:2 1087:2 1272:1
game 64:1 99:1 206:1 595:1
direct 50:1 69:1 1100:1 1765:1 2147:1 3160:1
每个密钥对是每个字符串出现在文档中的次数[docID]:[stringFq]
如何计算此文本文件中的密钥对数?
答案 0 :(得分:1)
你的正则表达式方法运行正常。这是一种迭代方法。如果您取消注释打印语句,您将发现一些非常规的结果。
<强>鉴于强>
%%file foo.txt
abstract 233:1 253:1 329:2 1087:2 1272:1
game 64:1 99:1 206:1 595:1
direct 50:1 69:1 1100:1 1765:1 2147:1 3160:1
<强>代码强>
import itertools as it
with open("foo.txt") as f:
lines = f.readlines()
#print(lines)
pred = lambda x: x.isalpha()
count = 0
for line in lines:
line = line.strip("\n")
line = "".join(it.dropwhile(pred, line))
pairs = line.strip().split(" ")
#print(pairs)
count += len(pairs)
count
# 15
<强>详情
首先我们使用with
语句,这是一个用于安全打开和关闭文件的习惯用语。然后,我们通过readlines()
将文件拆分为多行。我们定义一个稍后将使用的条件函数(或谓词)。 lambda表达式用于方便起见,等同于以下函数:
def pred(x):
return x.isaplha()
我们初始化一个count
变量并开始迭代每一行。每一行都可能有一个尾随的换行符\n
,因此我们先将strip()
它们移走,然后再将这行换行到dropwhile
。
dropwhile
是一个特殊的itertools迭代器。当它迭代一行时,它将丢弃满足谓词的任何前导字符,直到它到达第一个未通过谓词的字符。换句话说,开头的所有字母都将被删除,直到找到第一个非字母(恰好是一个空格)。我们再次清理新行,剥离前导空格,剩下的字符串为split()
到pairs
列表中。
最后,每对线的长度逐渐添加到count
。最终计数是pairs
的所有长度的总和。
<强>摘要强>
上面的代码展示了如何通过简单的迭代步骤解决基本文件处理问题:
答案 1 :(得分:0)
import re
file = open('input.txt', 'r')
file = file.read()
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", file)
#finds all ints from text file
numLen = len(numbers) / 2
#counts all ints, when I needed to count pairs, so I just divided it by 2
print(numLen)