Python - 计算文本文件中的键值对
Python - count key value pairs from text file
我有以下文本文件:
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]
您如何计算此文本文件中的密钥对数量?
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)
您的正则表达式方法工作正常。这是一种迭代方法。如果您取消注释打印语句,您将发现一些中间结果。
给定
%%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 迭代器。当它迭代一行时,它将丢弃满足谓词的任何前导字符,直到它到达第一个不满足谓词的字符。换句话说,开头的所有字母都将被丢弃,直到找到第一个非字母(恰好是 space)。我们再次清理新行,去掉开头的 space,剩下的字符串 split()
变成 pairs
的列表。
最后每行对的长度递增到count
。最后的计数是 pairs
所有长度的总和。
总结
上面的代码展示了如何通过简单的迭代步骤处理基本文件:
- 打开文件
- 将文件分成多行
- 迭代每一行时,清理和处理数据
- 输出一个结果
我有以下文本文件:
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]
您如何计算此文本文件中的密钥对数量?
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)
您的正则表达式方法工作正常。这是一种迭代方法。如果您取消注释打印语句,您将发现一些中间结果。
给定
%%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 迭代器。当它迭代一行时,它将丢弃满足谓词的任何前导字符,直到它到达第一个不满足谓词的字符。换句话说,开头的所有字母都将被丢弃,直到找到第一个非字母(恰好是 space)。我们再次清理新行,去掉开头的 space,剩下的字符串 split()
变成 pairs
的列表。
最后每行对的长度递增到count
。最后的计数是 pairs
所有长度的总和。
总结
上面的代码展示了如何通过简单的迭代步骤处理基本文件:
- 打开文件
- 将文件分成多行
- 迭代每一行时,清理和处理数据
- 输出一个结果