这是一个看似简单的问题:给定一个生成升序整数序列的迭代器列表,编写一个只生成每个序列中出现的整数的简洁生成器。
昨晚看了几篇论文后,我决定用 Python 编写一个完全最小的全文索引器,as seen here (虽然那个版本现在已经很老了)。
我的问题在于 search()
函数,它必须遍历每个发布列表并仅生成每个列表中出现的文档 ID。从上面的链接可以看出,我当前的非递归“工作”尝试很糟糕。
示例:
postings = [[1, 100, 142, 322, 12312],
[2, 100, 101, 322, 1221],
[100, 142, 322, 956, 1222]]
应该让步:
[100, 322]
至少有一个优雅的递归函数解决方案,但如果可能的话,我想避免这种情况。但是,涉及嵌套生成器表达式、itertools
滥用或任何其他类型的 Code Golf 的解决方案非常受欢迎。 :-)
应该可以将函数安排为只需要与最小列表中的项目一样多的步骤,而无需将整组整数吸入内存。将来,这些列表可能会从磁盘中读取,并且大于可用的 RAM。
在过去的 30 分钟里,我在舌尖有了一个想法,但我无法将其完全融入代码中。请记住,这只是为了好玩!
最佳答案
import heapq, itertools
def intersect(*its):
for key, values in itertools.groupby(heapq.merge(*its)):
if len(list(values)) == len(its):
yield key
>>> list(intersect(*postings))
[100, 322]
关于python - 加入一组产生 Python 迭代器的有序整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/969709/