Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-从文本文件中计算键值对_Python_Python 3.x_Key Value - Fatal编程技术网

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

Python-从文本文件中计算键值对,python,python-3.x,key-value,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] 如何计算此文本文件中的密钥对数 您的正则表达式方法运行良好。这里是一个迭代方法。如果取消对print语句的注释,您将发现一些itermediate结果 import re

我有以下文本文件:

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]


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

您的正则表达式方法运行良好。这里是一个迭代方法。如果取消对print语句的注释,您将发现一些itermediate结果

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
,因此我们首先
将它们剥离()
,然后再将行馈送到
dropwhile

是一个特殊的itertools迭代器。当它迭代一行时,它将丢弃满足谓词的任何前导字符,直到到达第一个不满足谓词的字符为止。换句话说,在找到第一个非字母(恰好是空格)之前,将删除开头的所有字母。我们再次清理新行,去掉前导空格,剩下的字符串是
split()
对的列表中

最后,每行对的长度以增量方式添加到
计数中。最终计数是
对的所有长度之和

摘要

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

  • 打开文件
  • 将文件拆分为行
  • 在迭代每一行时,清理并处理数据
  • 输出结果

我建议你关掉电脑,拿一张纸和一支铅笔。用文字描述你将如何手工解决这个问题。不要担心python语法。只需写下解决方案所需的步骤。你应该在答案中添加解释。解决代码和解释的问题,而不仅仅是代码。正则表达式是一种次优的方法;通过对空格字符进行字符串拆分,然后减去
1
(假设拆分字符串中的第一项始终是单词),可以更轻松、更容易地实现这一点。我将对此进行研究!谢谢你的回答!我是Python新手,所以这是非常有建设性的!