2013-07-23 6 views
0

Если у меня есть список строк, таких как:Как создать список слов из списка предложений?

lst = ['aa bb', 'cc dd', 'cc aa'] 

Как я могу получить это в список уникальных слов, таких, как это:

['aa', 'bb', 'cc', 'dd'] 

используя понимание? Вот, насколько я получил, но безрезультатно:

wordList = [x.split() for row in lst for x in row] 
+0

Может быть, просто переместить слова в набор? Набор содержит уникальные значения. –

+0

Имеет ли значение вопрос? – TerryA

ответ

1

Простейший подход, я думаю, вероятно, это, хотя и не самый эффективный.

set(' '.join(lst).split()) 

Если вы действительно хотите получить список, то просто завернуть, что в вызове list()

+0

Очень круто. Короткие и сладкие. Благодарю. – StatsViaCsh

2

Вы хотите перебрать значения расщепленных:

wordList = [word for row in lst for word in row.split()] 

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

wordList = list({word for row in lst for word in row.split()}) 

или просто использовать набор и сделать с ним:

wordList = {word for row in lst for word in row.split()} 

Demo:

>>> lst = ['aa bb', 'cc dd', 'cc aa'] 
>>> list({word for row in lst for word in row.split()}) 
['aa', 'cc', 'dd', 'bb'] 
>>> {word for row in lst for word in row.split()} 
set(['aa', 'cc', 'dd', 'bb']) 

Если порядок имеет значение (приведенный выше код возвращает слова в произвольном порядке, отсортированный порядок является совпадение в силе деталей реализации CPython) используйте отдельный набор для отслеживания повторяющихся значений:

seen = set() 
wordList = [word for row in lst for word in row.split() if word not in seen and not seen.add(word)] 

Для того, чтобы проиллюстрировать разницу, лучше входная выборка:

>>> lst = ['the quick brown fox', 'brown speckled hen', 'the hen and the fox'] 
>>> seen = set() 
>>> [word for row in lst for word in row.split() if word not in seen and not seen.add(word)] 
['the', 'quick', 'brown', 'fox', 'speckled', 'hen', 'and'] 
>>> {word for row in lst for word in row.split()} 
set(['and', 'brown', 'fox', 'speckled', 'quick', 'the', 'hen']) 
+0

Я знаю, что ОП запросил список, но если вы делаете набор, вероятно, нет причин сделать его списком - скорее, OP будет в порядке с набором. –

+0

@Lattyware: Там добавлено, что 'set()' является более простым вариантом. –

+0

Спасибо за деталь. – StatsViaCsh

1
In [25]: list({y for x in lst for y in x.split()}) 
Out[25]: ['aa', 'cc', 'dd', 'bb'] 

Чтобы сохранить его, значит удалить дубликаты из списка, вы можете обратиться к http://www.peterbe.com/plog/uniqifiers-benchmark.

+0

Убывает заказ, хотя – TerryA

+0

Да. Заказ не поддерживается. – zhangyangyu

+0

Я спросил ОП, если порядок имеет значение или нет :) – TerryA

1

Для поддержания порядка, вы можете сделать что-то вроде:

>>> from collections import OrderedDict 
>>> lst = ['aa bb', 'cc dd', 'cc aa'] 
>>> new = [] 
>>> for i in lst: 
...  new.extend(i.split()) 
... 
>>> list(OrderedDict.fromkeys(new)) 
['aa', 'bb', 'cc', 'dd'] 

Обратите внимание, что при использовании set(), наиболее вероятно, быстрее, так как Мартейн указал.

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