列表中关键字的频率

时间:2017-05-21 11:49:27

标签: python python-3.x jes

嗨所以我有2个文本文件我必须读取第一个文本文件计算每个单词的频率并删除重复项并创建一个列表,其中包含单词及其在文件中的计数。

我的第二个文本文件包含我需要在第一个文本文件中计算这些关键字的频率并在不使用任何导入,字典或拉链的情况下返回结果的关键字。

我被困在如何解决这个第二部分我打开文件并删除标点等但我不知道如何找到频率 我玩了.find()的想法,但到目前为止还没有运气。

任何建议都将被理解这是我的代码目前似乎在关键字文件中找到关键字的频率但不在第一个文本文件中

def calculateFrequenciesTest(aString):

   listKeywords= aString
   listSize = len(listKeywords)
   keywordCountList = []

   while listSize > 0:
      targetWord = listKeywords [0]
      count =0
      for i in range(0,listSize):
         if targetWord == listKeywords [i]:
            count = count +1

      wordAndCount = []
      wordAndCount.append(targetWord)
      wordAndCount.append(count)

      keywordCountList.append(wordAndCount)

      for i in range (0,count):
         listKeywords.remove(targetWord)
      listSize = len(listKeywords)

   sortedFrequencyList = readKeywords(keywordCountList)

   return keywordCountList;

编辑 - 目前正在寻找再次重新打开我的第一个文件的想法,但这一次没有把它变成一个列表?我认为我的错误是以某种方式来自它计算我的列表列表的频率。这些是我得到的结果类型

[[['the', 66], 1], [['of', 32], 1], [['and', 27], 1], [['a', 23], 1], [['i', 23], 1]]

3 个答案:

答案 0 :(得分:1)

您可以尝试以下内容:

我以单词列表为例。

word_list = ['hello', 'world', 'test', 'hello']
frequency_list = {}
for word in word_list:
    if word not in frequency_list:
        frequency_list[word] = 1
    else:
        frequency_list[word] += 1
print(frequency_list)

RESULT: {'test': 1, 'world': 1, 'hello': 2}

因为你对dicts有一个限制,我已经使用两个列表来完成相同的任务。我不确定它的效率如何,但它有助于达到目的。

word_list = ['hello', 'world', 'test', 'hello']
frequency_list = []
frequency_word = []
for word in word_list:
    if word not in frequency_word:
        frequency_word.append(word)
        frequency_list.append(1)
    else:
        ind = frequency_word.index(word)
        frequency_list[ind] += 1

print(frequency_word)
print(frequency_list)

RESULT : ['hello', 'world', 'test']
         [2, 1, 1]

您可以根据需要将其更改为您喜欢的方式或重新计算

答案 1 :(得分:0)

我同意@bereal你应该使用Counter。我看到你说过你不想要"进口,字典或拉链"所以请随意忽略这个答案。然而,Python的一个主要优点是它的标准库很棒,每当你有list可用时,你也会dictcollections.Counter和{{1} }。

从您的代码中我得到的印象是您希望使用与C或Java相同的样式。我建议尝试多一点pythonic。以这种方式编写的代码可能看起来不熟悉,并且可能需要时间来习惯。然而,你将学到更多。

你正在努力实现的目标会有所帮助。你在学习Python吗?你在解决这个具体问题吗?为什么你不能使用任何进口,字典或拉链?

所以这是一个利用内置功能(没有第三方)的提案,用于它的价值(用Python 2测试):

re

答案 2 :(得分:0)

这是一个没有导入的解决方案。它使用嵌套线性搜索,在小输入数组上进行少量搜索是可以接受的,但是输入较大时会变得笨拙和缓慢。

这里的输入仍然很大,但它在合理的时间内处理它。我怀疑你的关键字文件是否更大(我的只有3个单词),慢速开始显示。

这里我们获取一个输入文件,遍历这些行并删除标点符号,然后用空格分割并将所有单词拼合成一个列表。该列表具有欺骗性,因此为了删除它们,我们对列表进行排序,以便将欺骗结合在一起,然后迭代它,创建包含字符串和计数的新列表。我们可以通过在列表中出现相同的单词并且在看到新单词时移动到新条目来递增计数来实现此目的。

现在您有了单词频率列表,您可以在其中搜索所需的关键字并检索计数。

输入文本文件为here,关键字文件可以拼凑在一起,文件中只有几个单词,每行一个。

python 3代码,它表示适用于python 2的修改方法。

# use string.punctuation if you are somehow allowed 
# to import the string module.
translator = str.maketrans('', '', '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~')

words = []
with open('hamlet.txt') as f:
    for line in f:
        if line:
            line = line.translate(translator)
            # py 2 alternative
            #line = line.translate(None, string.punctuation)
            words.extend(line.strip().split())

# sort the word list, so instances of the same word are
# contiguous in the list and can be counted together
words.sort()

thisword = ''
counts = []

# for each word in the list add to the count as long as the 
# word does not change
for w in words:
    if w != thisword:
        counts.append([w, 1])
        thisword = w
    else:
        counts[-1][1] += 1

for c in counts:
    print('%s (%d)' % (c[0], c[1]))

# function to prevent need to break out of nested loop
def findword(clist, word):
    for c in clist:
        if c[0] == word:
            return c[1]
    return 0   

# open keywords file and search for each word in the 
# frequency list.
with open('keywords.txt') as f2:
    for line in f2:
        if line:
            word = line.strip()
            thiscount = findword(counts, word)
            print('keyword %s appear %d times in source' % (word, thiscount))

如果您如此倾向,可以修改findword以使用二进制搜索,但它仍然不会在dict附近。如果没有限制,collections.Counter是正确的解决方案。它更快,更少的代码。