Как я могу упростить и отформатировать эту функцию?

Итак, у меня есть этот грязный код, в котором я хотел получить каждое слово из frankenstein.txt, отсортировать их по алфавиту, исключить одно- и двухбуквенные слова и записать их в новый файл.

def Dictionary():

    d = []
    count = 0

    bad_char = '~!@#$%^&*()_+{}|:"<>?\`1234567890-=[]\;\',./ '
    replace = ' '*len(bad_char)
    table = str.maketrans(bad_char, replace)

    infile = open('frankenstein.txt', 'r')
    for line in infile:
        line = line.translate(table)
        for word in line.split():
            if len(word) > 2:
                d.append(word)
                count += 1
    infile.close()
    file = open('dictionary.txt', 'w')
    file.write(str(set(d)))
    file.close()

Dictionary() 

Как я могу упростить его и сделать его более читаемым, а также как сделать так, чтобы слова записывались вертикально в новом файле (он записывается в горизонтальном списке):

abbey
abhorred
about
etc....

2 ответа

Решение

Несколько улучшений ниже:

from string import digits, punctuation

def create_dictionary():

    words = set()

    bad_char = digits + punctuation + '...' # may need more characters
    replace = ' ' * len(bad_char)
    table = str.maketrans(bad_char, replace)

    with open('frankenstein.txt') as infile:
        for line in infile:
            line = line.strip().translate(table)
            for word in line.split():
                if len(word) > 2:
                    words.add(word)

    with open('dictionary.txt', 'w') as outfile:
        outfile.writelines(sorted(words)) # note 'lines'

Несколько заметок:

  • следовать руководству по стилю
  • string содержит константы, которые вы можете использовать для обозначения "плохих персонажей";
  • ты никогда не использовал count (который был просто len(d) тем не мение);
  • использовать with контекстный менеджер для обработки файлов; а также
  • используя set с самого начала предотвращает дублирование, но они не упорядочены (следовательно, sorted).

Использование повторного модуля.

import re

words = set()

with open('frankenstein.txt') as infile:
    for line in infile:
        words.extend([x for x in re.split(r'[^A-Za-z]*', line) if len(x) > 2])

with open('dictionary.txt', 'w') as outfile:
    outfile.writelines(sorted(words))

Из r'[^A-Za-z]*' в re.split замените 'A-Za-z' на символы, которые вы хотите включить в dictionary.txt.

Другие вопросы по тегам