从列表的单词列表生成唯一的单词列表

时间:2018-02-12 18:45:55

标签: python python-3.x list iterator

请参阅以下数据。我想从中获取一个独特的单词列表。 我为你准备了以下基本代码。有人可以在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']

3 个答案:

答案 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']