2

所以几天前我在 Python 中发现了 Sets,我很惊讶以前从未想过它们,尽管它们让很多事情变得非常简单。我稍后再举个例子。

有些事情我还不清楚。文档说可以从可迭代对象中创建集合,并且操作员总是返回新的集合,但是他们总是将所有数据从一个集合复制到另一个集合并从可迭代对象中复制吗?我处理大量数据,并且希望拥有与 itertools 非常相似的 Set 和集合运算符。因此 Sets([iterable]) 更像是一个包装器,并且运算符 union、intersection 等将返回“iSets”并且不会复制任何数据。一旦我迭代我的最终集合,他们都会评估。最后,我真的很想拥有“iSet”运营商。

目的: 我使用 mongoengine 与 MongoDB 合作。我保存了文章。有些与用户相关联,有些被标记为已读,有些则显示给用户,依此类推。将它们包装在不加载所有数据的集合中将是组合、相交等它们的好方法。显然我可以进行特殊查询,但并非总是如此,因为 MongoDB 不支持连接。所以我最终在 Python 中进行连接。我知道那时我可以使用关系数据库,但是,我不需要经常进行连接,而且在我的情况下,MongoDB 的优势超过了它们。

所以你怎么看?是否已经有第三方模块?几行结合 itertools 和 Sets 可以吗?

编辑: 我接受了 Martijn Pieters 的回答,因为它显然是正确的。我最终只将 ID 加载到集合中以使用它们。此外,Python 中的集合具有相当好的运行时间。

4

1 回答 1

4

集合就像dictand list; 在创建时,他们从种子迭代中复制引用。

迭代器不能是集合,因为您不能强制执行集合的唯一性要求。您无法知道迭代器产生的未来值是否已经被看到过。

此外,为了让您确定两个迭代之间的交集是什么,您必须从这些迭代中的至少一个中加载所有数据以查看是否有任何匹配项。对于第二个迭代中的每个项目,您需要测试该项目是否已在第一个迭代中看到。为了有效地做到这一点,您需要将第一个迭代中的所有项目加载到一个集合中。另一种方法是从第二个迭代中的每个项目从头到尾循环遍历第一个迭代,从而导致指数级的性能下降。

于 2012-11-13T10:22:13.243 回答