因此,我写了一些代码来确定文本文件中最常见的4个单词,然后查找出现2%或更多的所有单词。到目前为止,我的代码运行良好。但是我必须将for循环变成列表推导。
到目前为止,我已经尝试过:
percent_list = [word, freq in word_counts.most_common(total) if ((freq/total)*100) >= 2.0]
对于第二个for循环,(请参阅下面的整个代码。)但是,它不起作用。对于列表理解来说,这似乎有点长,因为所有在线列表看起来都短得多。
这是整个程序。一共有两个for循环。
from collections import Counter
from operator import itemgetter
STOP = ["the", "and", "in", "to", "a", "of", "at", "it", "but", "its","it's", "that", "was", "with", "as", "are", "i","this", "for", "if"]
word_counts = Counter()
with open("file.txt") as f:
for token in f.read().split():
if token.lower() not in STOP:
word_counts[token.lower()] += 1
print( word_counts.most_common(4), ":")
total = sum(word_counts.values())
print("\nWords that occur for 2% or more are: ")
for word, freq in word_counts.most_common(total):
if ((freq/total)*100) >= 2.0:
print("\n {} ".format(word))
答案 0 :(得分:1)
我认为这应该可以解决您的问题。它将返回单词和频率的元组列表。
percent_list = [(word, freq) for word,freq in word_counts.most_common(total) if ((freq/total)*100) >= 2.0]
答案 1 :(得分:1)
通过最简单的理解,我们可以首先了解它们在展开时的外观。
通常,list
会理解这种形式:
result = []
for element in source:
if predicate(element):
result.append(modify(element))
可以简化为:
result = [modify(element) for element in source if predicate(element)]
这里的问题是,由于source
的等效项是word_counts(most_common).total
,因此我们要一次遍历两个元素。
因此,我们可以通过这种方式编写展开的for
循环:
result = []
for word, freq in word_counts.most_common(total):
if ((freq / total) * 100) >= 2:
result.append((word, freq))
请注意word, freq
周围的一对多余的括号;形成tuple
,它是 one 元素。请记住,您一次只能通过list
向append
添加一个元素。
这给我们以下理解:
[(word, freq)
for word, freq in word_counts.most_common(total)
if ((freq / total) * 100) >= 2]