Как я могу упростить и отформатировать эту функцию?
Итак, у меня есть этот грязный код, в котором я хотел получить каждое слово из 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.