请参阅以下数据。我想从中获取一个独特的单词列表。 我为你准备了以下基本代码。有人可以在Python 3.X中改进代码以获得更好,更快的性能吗?
data = [
[
['hello'],
['hi', 'top'],
['how', 'are', 'you']
],
[
['hey', 'jane'],
['good', 'morning'],
['how', 'are', 'you']
]
]
vocab = []
for d in data:
for s in d:
for w in s:
if w not in vocab:
vocab.append(w)
vocab = sorted(vocab)
print(vocab) # ['are', 'good', 'hello', 'hey', 'hi', 'how', 'jane', 'morning', 'top', 'you']
答案 0 :(得分:4)
如果元素是 hashable (字符串 可以删除),那么通常不自己进行唯一性检查是个好主意。 Python已经为此设计了一个构造:set
。集合保证每个相等的元素最多出现一次(因此它会发生一次,或者根本不发生)。
我们可以提供一个set(..)
一个可迭代的,比如一个生成单词的生成器,在构造了set之后,我们可以(可选)对集合中的元素进行排序,所以:
sorted(set(w for d in data for s in d for w in s))
所以在这里我们首先构造一个set
生成器(w for d in data for s in d for w in s)
生成的元素(它基本上是级联for
循环的紧凑表示)。 set
使用散列,因此可以非常快速地检查成员资格。接下来,我们遍历set(..)
并对产生的元素进行排序。
现代版本的Python也支持 set comprehension :我们可以将set(<generator-expr>)
合并到{<generator-expr>}
中,这在语法上更好,但通常也会实现一些加速,所以:< / p>
sorted({w for d in data for s in d for w in s})
答案 1 :(得分:3)
more_itertools.collapse
展开深层嵌套列表,您可以通过set()
获取独特的字词。
import more_itertools as mit
set(mit.collapse(data))
# {'are', 'good', 'hello', 'hey', 'hi', 'how', 'jane', 'morning', 'top', 'you'}
more_itertools
是第三方套餐。通过> pip install more_itertools
安装。
答案 2 :(得分:1)
您可以在递归中使用set comprehension:
data = [
[
['hello'],
['hi', 'top'],
['how', 'are', 'you']
],
[
['hey', 'jane'],
['good', 'morning'],
['how', 'are', 'you']
]
]
def get_unique(s):
return {i for c in [b if all(isinstance(d, str) for d in b) else get_unique(b) for b in s] for i in c}
print(list(get_unique(data)))
输出:
['good', 'top', 'hey', 'morning', 'how', 'hi', 'are', 'jane', 'you', 'hello']