2013-10-20 2 views
0

Я хотел удалить пробелы из своего элемента списка и разделить их на разные элементы списка. Например, если у меня есть список:Удаление пространства из элемента списка?

['Hello world', 'testing', 'testing two'] 

Я хочу список выглядеть следующим образом:

['Hello', 'world', 'testing', 'testing', 'two'] 

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

with open(fname, 'r') as f: 
    words = [line.strip().strip(' ') for line in f] 
print words 

Это просто распечатывает то, что я упоминал ранее выше, с элементами списка, все еще имеющими пробелы.

Если бы кто-нибудь мог мне помочь, это было бы здорово! Благодаря!

+0

возможный дубликат [возвращает список слов, после чтения файла в питоне] (HTTP: // StackOverflow. com/questions/13259288/return-a-list-of-words-after-reading-a-file-in-python) – kojiro

ответ

2

split() расщепляется на любом белом пространстве по умолчанию, так что вы можете сделать весь файл в один шаг.

words = f.read().split() 

Если вы хотите, чтобы избежать чтения весь файл в память с f.read():

words = [word for line in f for word in line.split()] 
+1

Я думал о публикации этого ответа ... У него могут быть проблемы с действительно большими файлами, но, как правило, в наши дни это, вероятно, не вызывает беспокойства. – mgilson

+0

@mgilson: Я тоже думал о большой проблеме с файлами, но подумал, что если у него достаточно памяти для хранения всех слов в отдельности, у него, вероятно, будет достаточно памяти для всего фрагмента. –

0

Вы ищете метод split. Самый простой способ сделать то, что вы хотите выглядеть следующим образом:

words = [] 
with open(fname) as f: 
    for line in f: 
    words.extend(line.split()) 

и немного поумнее метод выглядит следующим образом:

import itertools 
with open(fname) as f: 
    words = list(itertools.chain.from_iterable(l.split() for l in f)) 

Я не знаю, что быстрее. Обратите внимание, что при вызове без аргумента разделителя, split эффективно выполняет то, что strip делает, а также разбивает пробелы в пространстве, поэтому вам не нужно сначала звонить strip.

3

Я хотел бы сделать что-то вроде этого:

" ".join(list).split(" ") 

Это войдет в список вместе, а затем разделить его на части. Есть, вероятно, несколько более эффективные способы, но этот способ прост.

1

.strip только удаляет материал с начала или конца строки. То, что вы хотите, чтобы split жала на пробельных:

lines_split = [line.split() for line in f] 

Это даст вам вложенный список, который вы можете легко сглаживаться. См. Например, answer или one.

Мой предпочтительный подход здесь состоял бы в том, чтобы написать простой генератор до yield слова за раз. Затем вы можете включить его в список позже, если вам нужно:

def get_words(filename): 
    with open(filename) as fin: 
     for line in fin: 
      for word in line.split(): 
       yield word 

Там какая-то магия вы можете сделать, чтобы уплотнить это вниз с itertools, но это должно хватить на данный момент.

0

Мне нравится ответ Zonedabone. Но вот еще один способ:

>>> from itertools import chain 
>>> l = ['Hello world', 'testing', 'testing two'] 
>>> result = list(chain.from_iterable(w.split() for w in l)) 
# ['Hello', 'world', 'testing', 'testing', 'two'] 
+1

для чего это стоит, 'chain.from_iterable (w.split() для w в l)' обычно предпочтительнее «chain (* [...])». Последнее в значительной степени избавляет от всех преимуществ использования итерируемых объектов в первую очередь. – mgilson

+0

Это действительно круто. Благодарю. Обновлено. – mshsayem

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