однострочный синтаксис python - PullRequest
0 голосов
/ 31 марта 2019

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

мой код:

def print_words(filename):
  my_file = open(filename, 'r')
  word_dict = {}
  for line in my_file:
    line.lower()
    words_in_line = line.split(" ")
    word_dict[word] += 1 if word_dict.get(word) else word_dict[word] = 0 
      for word in words_in_line

сообщение об ошибке:

word_dict[word] += 1 if word_dict.get(word) else word_dict[word] = 0 for word in words_in_line
                                                                 ^
SyntaxError: invalid syntax

Я также попытался написать его немного по-другому (код будет следовать), но все равно получил ту же ошибку,но когда я удалил «= 0», синтаксис был в порядке (когда я удалил его из оригинального лайнера, синтаксис все еще был инвазирован).

my_file = open(filename, 'r')
word_dict = {}
for line in my_file:
  line.lower()
  words_in_line = line.split(" ")
  for word in words_in_line:
    word_dict[word] += 1 if word_dict.get(word) else word_dict[word] = 0

Ответы [ 3 ]

1 голос
/ 31 марта 2019

Вы можете сделать это с помощью регулярного выражения, чтобы получить слова и класс Counter (из коллекций) для их подсчета:

from collections import Counter
import re
with open("testfile.txt") as file: words = Counter(re.findall("\w+",file.read()))

Если файл огромен, вам может понадобиться обработать его построчнострока:

with open("testfile.txt") as file: words = Counter( w for line in file for w in re.findall("\w+",line.upper()))
0 голосов
/ 31 марта 2019

Использовать стандартную диктовку вместо обычной.

from collections import defaultdict

def print_words(filename):
    with open(filename, 'r') as my_file:
        word_dict = defaultdict(int)
        for line in my_file:
            for word in line.lower().split(" "):
                word_dict[word] += 1

    ...

Или сделайте шаг вперед и используйте Counter.

from collections import Counter
from itertools import chain

def print_words(filename):
    flatten = chain.from_iterable
    with open(filename, 'r') as my_file:
        word_dict = Counter(flatten(line.lower().split(" ") for line in my_file))

    ...
0 голосов
/ 31 марта 2019

def print_words(filename): my_file = (open(filename, 'r').readlines()) word_dict = {} for line in my_file: line.lower() words_in_line = line.replace("\n","").split(" ") for word in words_in_line: if word in word_dict: word_dict[word] =word_dict[word]+ 1 else: word_dict[word] = 1

...