удаление знаков препинания и поиск уникальных слов в Python - PullRequest
0 голосов
/ 31 октября 2019

Итак, моя задача такова:

Написать программу, которая отображает список всех уникальных слов, найденных в файле uniq_words.txt. Распечатайте результаты в алфавитном порядке и в нижнем регистре. Подсказка: сохраняйте слова как элементы набора;удалите знаки препинания, используя string.punctuation из строкового модуля.

В настоящее время у меня есть код:

def main():
    import string

    with open('uniq_words.txt') as content:
        new = sorted(set(content.read().split()))
        for i in new:
            while i in string.punctuation:
                new.discard(i)
                print(new)

main()

Если я запускаю код как таковой, он входит в бесконечный цикл печати уникальных слов снова и снова. В моем наборе есть еще слова, которые выглядят как «значение». или "никогда / иметь". Как удалить пунктуацию с помощью модуля string.punctuation? Или я подхожу к этому с неправильного направления? Буду признателен за любой совет!

Редактировать: ссылка мне не помогает, в том, что данный метод не работает в списке.

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Мое решение:

import string
with open('sample_string.txt') as content:
    sample_string = content.read()
    print(sample_string)
    # Sample string: containing punctuation! As well as CAPITAL LETTERS and duplicates duplicates.
    sample_string = sample_string.strip('\n')
    sample_string = sample_string.translate(str.maketrans('', '', string.punctuation)).lower()
    out = sorted(list(set(sample_string.split(" "))))
    print(out)
    # ['and', 'as', 'capital', 'containing', 'duplicates', 'letters', 'punctuation', 'sample', 'string', 'well']
0 голосов
/ 31 октября 2019

Это на самом деле две задачи, поэтому давайте разделим это на два вопроса. Я займусь вашей проблемой, касающейся удаления знаков препинания, потому что вы проявили собственные усилия в этом вопросе. Для определения уникальных слов, пожалуйста, откройте новый вопрос (а также ищите похожие вопросы здесь о переполнении стека, прежде чем публиковать новый вопрос, я уверен, что вы найдете что-то полезное!)

Вы правильно нашливыходит, что вы попали в бесконечный цикл. Это потому, что ваше while условие цикла всегда выполняется, когда i является символом пунктуации. Удаление i из new не меняет этого. Вы избегаете этого, используя простое if -условие. На самом деле, ваш код смешивает концепцию while и if, а ваш сценарий адаптирован для if заявления. Я думаю, вы думали, что вам нужен цикл while, потому что вы имели в виду концепцию итерации. Но вы уже перебираете content в цикле for. Итак, исправление ошибки будет выглядеть следующим образом:

for i in new:
    if i in string.punctuation:
        new.discard(i)

Однако другой и более «питонический» способ - использовать списочное понимание вместо for -loop

with open("uniq_words.txt") as content:
    stripped_content = "".join([
        x 
        for x in content.read() 
        if x not in string.punctuation
    ])
...