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 所有长度的总和。

总结

上面的代码展示了如何通过简单的迭代步骤处理基本文件:

  • 打开文件
  • 将文件分成多行
  • 迭代每一行时,清理和处理数据
  • 输出一个结果