2012-04-27 44 views
0

目前我在做这个构建发电机返回唯一值:是否可能,建议从集合

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

然而,唯一往往是暂时性的。为唯一身份构建一个发电机会更好吗?如果是这样,我将如何做到这一点?

回答

0

有使用发电机,而不是静态的集合,其中只有一个(可能)在这里也适用两种可能的好处:

  • 内存使用情况。这里不适用,因为要产生唯一性,你需要这种方式的O(n)内存或其他方法

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

1

我不完全清楚你希望通过使用发电机来实现什么。

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

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

1

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

或者,您也可以定义一个发电机:

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

,但我的直觉是,这将不仅仅是一次性构建一组慢了许多。无论如何,内存消耗大致相同。

相关问题