2013-07-23 53 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()是最有可能更快,因为马亭指出。