Превращение чтения файлов для циклов в списки - PullRequest
1 голос
/ 07 апреля 2019

Итак, я написал код, который определяет 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))

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

С помощью самых простых представлений мы можем сначала посмотреть, как они будут выглядеть при развертывании.

В общем, 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, который является одним элементом. Помните, что вы можете добавлять только один элемент за раз от list до append.

Это дает нам следующее понимание:

[(word, freq) 
 for word, freq in word_counts.most_common(total) 
 if ((freq / total) * 100) >= 2]
1 голос
/ 07 апреля 2019

Я думаю, что это должно решить вашу проблему. Он вернет список кортежей слов и частот.

percent_list = [(word, freq) for word,freq in word_counts.most_common(total) if ((freq/total)*100) >= 2.0]  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...