是否可能并且建议从集合中构造返回唯一值的生成器

时间:2012-04-27 13:06:03

标签: python generator python-2.7

目前我正在这样做:

# duplicates is a list
uniques = list(set(duplicates))

然而,独角兽通常是短暂的。为uniques构建一个生成器会更好吗?如果是这样,我该怎么做?

3 个答案:

答案 0 :(得分:2)

如果您不需要列表,请改用set(duplicates)。这大约减少了你的记忆使用量。集合是可迭代的。

或者,您可以定义生成器:

def uniques(it):
    seen = set()
    for x in it:
        if x not in seen:
            yield x
            seen.add(x)

但我的预感是,这将比一次性构建一套更慢。无论如何,内存消耗大致相同。

答案 1 :(得分:1)

对我来说,使用发电机希望实现的目标并不完全清楚。

有一件事是清楚的:它不会降低内存需求,因为为了确定当前元素是否唯一,生成器需要知道所有以前看到的唯一元素。

此外,在list(set(...))中构建列表的目的并不完全清楚。为什么不坚持你已经建造的那套?

答案 2 :(得分:0)

使用生成器而不是静态集合有两个可能的好处,其中只有一个(可能)适用于此:

  • 内存使用情况。这里不适用,因为为了生成唯一身份,你需要O(n)内存这种方式或其他

  • 时间 - 如果您希望仅消耗部分生成的输出,那么您可以通过延迟生成来节省时间。所以,如果这是你的情况,那么使用发电机可以节省一些处理能力。当然,为了懒惰地产生唯一身份,你需要记住已经产生的一组值(见上文)并在你去的时候过滤掉它们。