Python - 从文本文件中计算键值对

时间:2017-10-30 19:28:49

标签: python python-3.x key-value

我有以下文本文件:

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]

如何计算此文本文件中的密钥对数?

2 个答案:

答案 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)