python - 加入一组产生 Python 迭代器的有序整数

标签 python join code-golf iterator generator

这是一个看似简单的问题:给定一个生成升序整数序列的迭代器列表,编写一个只生成每个序列中出现的整数的简洁生成器。

昨晚看了几篇论文后,我决定用 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/

相关文章:

python - Tkinter 绘制矩形未按预期工作

Python - PySpark 的 Pickle Spacy

mysql - 改进我的查询

php - 使用 INNER JOIN/JOIN 进行多个查询

language-agnostic - Code Golf : Code 39 Bar Code

python - 取消 NumPy 内存映射的映射

python - 使用子进程运行多个 bash 命令

sql - 在一个特定列上连接多个表

language-agnostic - 自动求和数字列并打印总计

language-agnostic - Code Golf : Calculate Orthodox Easter date