【问题标题】:Python - count key value pairs from text filePython - 从文本文件中计算键值对
【发布时间】:2017-10-31 23:11:40
【问题描述】:

我有以下文本文件:

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]

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

【问题讨论】:

  • 我建议你关掉电脑,拿一张纸和一支铅笔。 用语言描述你将如何手工解决这个问题。不用担心 python 语法。只需编写解决方案所需的步骤即可。

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


【解决方案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 的所有长度的总和。

总结

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

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

【讨论】:

  • 感谢您的回答!我是 Python 新手,所以这是非常有形式的!
【解决方案2】:
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)

【讨论】:

  • 您应该在答案中添加解释。用代码和解释解决问题,而不仅仅是用代码。
  • 正则表达式是执行此操作的次优方法;您可以使用对空格字符进行字符串拆分,然后减去1(假设拆分字符串中的第一项始终是一个单词)来更轻松、更易读地实现这一点。
  • 我会调查的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多