Много ошибок в такой маленькой программе. Давайте перечислим их, ладно.
...
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
- это просто ваша исходная строка ввода.