0

我有以下程序,我想在我的文本文件中找到例如字符串“浅粉色”!我使用word==' '.join(['light','pink'])它,它不起作用。

from operator import itemgetter

def mmetric1(file):
    words_gen = (word.lower() for line in open("test.txt")
                                             for word in line.split())
    words = {}

    for word in words_gen:
        if (word=='aqua')or(word=='azure')or(word=='black')or(word=='light pink'):
            words[word] = words.get(word, 0) + 1

    top_words = sorted(words.items(), key=itemgetter(1))

    for word, frequency in top_words:
       print ("%s : %d" % (word, frequency))
4

3 回答 3

1

您已经将整行拆分为单独的单词:

for word in line.split()

所以没有一个单词words_gen包含文本light pink。相反,它包含lightandpink作为两个单独的单词,以及该行上的所有其他单词。

你需要一种不同的方法;看看正则表达式。

于 2013-04-24T09:19:29.987 回答
1

你的整个方法都是错误的。

在我看来,您想检查文件中是否存在一组字符串。您应该使用正则表达式。

这里:

from collections import Counter
import re

def mmetric1(file_path, desired):
    finder = re.compile(re.escape('(%s)' % '|'.join(desired)), re.MULTILINE)
    with open(file_path) as f:
        return Counter(finder.findall(f))

# have a list of the strings you want to find
desired = ['aqua', 'azure', 'black', 'light pink']
# run the method
mmetric1(file_path, desired)

如果您担心大文件和性能,您可以遍历文件中的行:

def mmetric1(file_path, desired):
    results = Counter()
    finder = re.compile(re.escape('(%s)' % '|'.join(desired)))
    with open(file_path) as f:
        for line in f:
            Counter.update(finder.findall(line))
    return results

要按照您自己的方式打印这些结果:

for word, frequency in mmetric1(file_path, desired).items():
    print ("%s : %d" % (word, frequency))
于 2013-04-24T09:25:27.350 回答
0

拆分字符串时,其拆分基于空格,其中包括空格字符

所以以后,除了 IF 之外,您将不可能以您建议阅读的方式匹配连续的单词

  • 你不想修改你的循环

示例代码

try:
   while True:
        word = next(words_gen)
       if any(word == token for token in ['aqua', 'azure', 'black']) \
          or (word == 'light' and  next(word) == 'pink'):
            words[word] = words.get(word, 0) + 1 
except StopIteration:
    pass
  • 使用正则表达式

如果您正在搜索一个巨大的文件,这不是一个好的选择

  • 使用其他一些数据结构,如前缀树
于 2013-04-24T09:24:07.617 回答