Как вы возвращаете все слова в текстовом файле (один раз за слово) в алфавитном порядке? - PullRequest
0 голосов
/ 23 февраля 2020

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

Вот мой код:

file = input("Enter the input file name:")
f = open(file, 'r')
words = f.read()
unique_words = sorted(words.split(' '))
for word in words:
    if word == word:
        value = word
        unique_words.remove(value)
    else:
        print(word)

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Вы можете использовать набор для удаления дубликатов, а затем передать его встроенной функции sorted().

file = input("Enter the input file name:")
with open(file) as f:
    for word in sorted(set(f.read().split())):
        print(word)

Здесь «слово» означает группы символов, разделенные пробелом. В зависимости от вашего файла, это может быть достаточно хорошо. Если вам нужно отфильтровать пунктуацию, вы можете использовать регулярное выражение вместо .split(). Вы также можете использовать строчные буквы, если не хотите, чтобы версия в верхнем регистре считалась другим словом. Зависит от вашего файла и от того, что именно вы пытаетесь сделать.

import re
file = input("Enter the input file name:")
with open(file) as f:
    for word in sorted(set(re.findall('\w+', f.read().lower()))):
        print(word)

\w+ будет соответствовать "символам слова", тогда как .lower() преобразует всю строку, прочитанную из файла, в строчные буквы.

0 голосов
/ 23 февраля 2020

Много ошибок в такой маленькой программе. Давайте перечислим их, ладно.

...
unique_words = sorted(words.split(' '))

Выглядит хорошо до сих пор. Но затем вы сталкиваетесь с несколькими логическими проблемами:

for word in words:

Если вы распечатаете, что такое word, вы увидите, что это буква . Это потому, что вы перебираете исходную строку words. Вы намеревались использовать unique_words здесь, список , который вы подготовили только строкой ранее.

if word == word:

Это не может быть неудачным. Одна и та же строка всегда равна одной и той же строке. (Трудно представить иначе; но учтите, что это верно только для строк . Другие объекты могут иметь это любопытное свойство.) Вы, вероятно, имели в виду if word in words, а с более ранним исправлением more вероятно if word in unique_words. Это лишний тест - вы уже зацикливаете на unique_words, так что да, каждый word уже находится в unique_words. Таким образом, даже больше возможно, вы имели в виду что-то вроде "это слово встречается * на 1030 * больше , чем один раз в моем списке?"

Возможно, вы пытались сделать это как есть, потому что в других языках для проверки требуется двойной for l oop. Python имеет count; Вы могли бы использовать if unique_words.count(word) > 1 здесь. Но вы не должны не. Посмотрим почему.

    value = word
    unique_words.remove(value)

Это огромная проблема. Это изменит список unique_words здесь, пока он зацикливается. Это большое нет-нет, потому что внутренние счетчики l oop (тогда исходная длина unique_words выключена.

Эта проблема зацикливания появилась в моем предыдущем исправлении для вашего кода, так что давайте Предположим, что вы предполагали это вместо этого:

for word in words.split():
    if word in unique_words:
        value = word
        unique_words.remove(value)
    else:
        print(word)

- обратите внимание на небольшую корректировку первой строки. Нет ошибки, но она все равно не работает (как задумано), потому что теперь она ничего не печатает. удаляя каждое слово из unique_list ...

Вы можете решить эту проблему, как указано выше, используя count снова:

if unique_words.count(word) > 1:

и, наконец, вы получить только одно вхождение для каждого слова.

Поскольку проблема only состоит в получении списка уникальных слов, существует простое и очень Pythoni c решение: используйте set. Уникальная особенность set, по сравнению с list, заключается в том, что для каждого элемента допускается , только , который может встречаться только один раз. Если преобразовать list в set, все дубликаты магическим образом исчезают.

print (set(unique_words))
>>> {'alphabetical', 'printed', 'I', 'out', 'list.', 'that.', ...

Но что за счастье? в порядке сортировки? Как таковое, содержимое набора не сохраняется в упорядоченном списке (из-за способа работы строки hashes ). Итак, хитрость заключается в том, чтобы сначала удалить дубликаты, а затем отсортировать:

unique_words = sorted(set(words.split(' ')))
print (unique_words)

, где больше не нужно никаких циклов и words - это просто ваша исходная строка ввода.

...