2016-07-11 2 views
2

Я пытаюсь извлечь уникальные слова из следующего текста в 1 список.python extract word из нескольких строк в 1 список

But soft what light through yonder window breaks 
It is the east and Juliet is the sun 
Arise fair sun and kill the envious moon 
Who is already sick and pale with grief 

Но я продолжаю получать список в списке для каждой строки текста. Я понимаю, что у меня есть «\ n», чтобы избавиться, но не могу понять, как это сделать.

Вот мой код:

fname = input("Enter file name: ") 
fh = open(fname) 
lst = list() 
for line in fh: 
    line = line.rstrip("\n") 
    for word in line: 
     word = line.lower().split() 
     lst.append(word) 
print(lst) 

И выход я получаю:

[['but', 'soft', 'what', 'light', 'through', 'yonder', 'window', 'breaks'], ['it', 'is', 'the', 'east', 'and', 'juliet', 'is', 'the', 'sun'], ['arise', 'fair', 'sun', 'and', 'kill', 'the', 'envious', 'moon'], ['who', 'is', 'already', 'sick', 'and', 'pale', 'with', 'grief']] 

Спасибо !!

+0

'для слова в строке:. Слово = line.lower() раздельным()' .Есть не использовать для 'слова в line' здесь, так как вы переназначаете «слово» прямо под ним. Вместо этого: 'for word in line.split(): lst.append (word)' может быть ближе к тому, что вы хотите. – Evert

+0

Спасибо всем за помощь, это было очень полезно. И гораздо чище, чем решение, с которым я столкнулся: используя цикл 'count = count + 1' с' word [count] '. – Nodar95

ответ

2

Когда вы делаете line.lower.split(), вы получаете список слов. Вы добавляете список слов в свой список, lst. Используйте расширение, а не append. Расширение будет добавлять каждый элемент списка, возвращаемого функцией split(). Также не требуется второй для цикла for word in line:. Кроме того, если вы хотите извлечь уникальные слова, вам может понадобиться изучить тип набора данных.

2

Используйте это:

list += word 

Вместо:

lst.append(word) 
+0

** Добавить ** добавить список в список, но ** + ** объединяет их. – BladeMight

+1

'.extend' скорее всего будет более явным. Также работает с неперечисленными итерами. –

0

список понимание делает то же самое, как вы сделали.

Затем используйте chain.from_iterable в цепи все подсписки в один список:

from itertools import chain 

lst = list(chain.from_iterable(line.lower().split() for line in f)) 
+0

OP не хочет вложенного списка, они пытаются получить результат только строк, а не подписок строк. –

+0

@ TadhgMcDonald-Jensen Я неправильно понял вопрос OP. Спасибо за то, что –

+0

используйте ['chain.from_iterable'] (https://docs.python.org/3.5/library/itertools.html#itertools.chain.from_iterable) вместо' chain (* [..]) ' , –

0

Если заказ не имеет значения, вы можете использовать набор вместо списка:

fname = input("Enter file name: ") 
fh = open(fname) 
uniq_words = set() 
for line in fh: 
    line = line.strip() 
    uniq_words_in_line = line.split(' ') 
    uniq_words.update(uniq_words_in_line) 
print(uniq_words) 
+0

, вы можете использовать '.update', чтобы сделать объединение на месте вместо воссоздания нового набора на каждом шагу. –

+0

@ TadhgMcDonald-Jensen, хорошее предложение, я только что обновил свой ответ. –

+0

Обновление выполняется с любой итерацией, нет необходимости в заданном вызове. –

0

Как @Shalan и @BladeMight, проблема заключается в том, что word = line.lower().split() создает список, а append добавляет список, а не добавляет к нему. Я думаю, что синтаксически простой способ, чтобы написать это было бы:

fname = input("Enter file name: ") 
fh = open(fname) 
lst = list() 
for line in fh: 
    line = line.rstrip("\n") 
lst += line.lower().split() 

 Смежные вопросы

  • Нет связанных вопросов^_^