2013-07-23 46 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

打電話也許只是移動的話成爲一個集? Set包含唯一值。 –

+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()} 

演示:

>>> 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要求提供一個列表,但是如果你正在製作一個列表,那麼可能沒有理由將它列入列表中 - 這更可能是OP對於一組列表而言更好。 –

+0

@Lattyware:在那裏增加了一個'set()'是更簡單的選項。 –

+0

謝謝你的細節。 – StatsViaCsh

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()是最有可能更快,因爲馬亭指出。