Не сортируется список Python
Всем добрый день! Возникла проблема с сортировкой списка. Требуется прочитать файл, разбить каждую строку на список слов, для каждого слова проверить, есть ли слово в списке, после завершения программы отсортировать и распечатать слова в алфавитном порядке. Не могу понять чем вызвана эта проблема, список сформировался, но сортировка по алфавиту не происходит.
romeo_append = []
romeo_open = open('romeo.txt')
for romeo_list in romeo_open:
romeo_split = romeo_list.split()
if romeo_split in romeo_append:
continue
romeo_append.append(romeo_split)
romeo_append.sort()
print(romeo_append)
Вывод должен быть таким:
['Arise', 'But', 'It', 'Juliet', 'Who', 'already', 'and', 'breaks', 'east', 'envious', 'fair', 'grief', 'is', 'kill', 'light', 'moon', 'pale', 'sick', 'soft', 'sun', 'the', 'through', 'what', 'window', 'with', 'yonder']
А на деле он вот такой:
[['Arise', 'fair', 'sun', 'and', 'kill', 'the', 'envious', 'moon'], ['But', 'soft', 'what', 'light', 'through', 'yonder', 'window', 'breaks'], ['It', 'is', 'the', 'east', 'and', 'Juliet', 'is', 'the', 'sun'], ['Who', 'is', 'already', 'sick', 'and', 'pale', 'with', 'grief']]
Ответы (2 шт):
Чтобы расширить список всеми элементами другого, используйте + или extend.
Аппендом же вы добавляете подсписок.
Проблема в том что вы обрабатываете строки целиком (в виде списков) а нужно обрабатывать отдельные слова. Вот ваш код с минимальными изменениями:
romeo_append = []
romeo_open = open('romeo.txt')
for romeo_list in romeo_open:
romeo_split = romeo_list.split()
for word in romeo_split:
if word in romeo_append:
continue
romeo_append.append(word)
romeo_append.sort()
print(romeo_append)
Но это решение не из быстрых если текст будет достаточно длинным. Вместо списка лучше хранить множество:
romeo_set = set()
romeo_open = open('romeo.txt')
for romeo_list in romeo_open:
romeo_split = romeo_list.split()
for word in romeo_split:
romeo_set.add(word)
romeo_append = sorted(romeo_set)
print(romeo_append)
И если делать код совсем питоновским, то надо отделить перебор слов от их обработки:
def words(f):
for line in f:
yield from line.split():
with open('romeo.txt') as f:
romeo_list = sorted(set(words(f)))
print(romeo_list)