快速搜索更大整数列表中的整数列表

时间:2015-12-14 10:09:14

标签: python algorithm list search

我正在寻找以下有效的python实现:

我有一大组整数列表,长度在4到100之间,但大多数长度为4-10。总数可能高达一百万,具体取决于数据集。它们是特定于订单的。整数本身的范围从0到< = 99999。

我将输入长度在3到5个整数之间的搜索列表,再次按特定顺序排列。我需要从更大的整数列表集中找到所有示例,其中列表包含输入搜索列表。

例如:示例大整数列表[1,40,98,32,778],[7,9347,21,98345,632,444],[87567,4563,97,40,87],[ 1,40,98,32,778],[4563,97,40,87,76],[935,57342,86,213,89674,4327,9641,13283],[4563,40,87,76, 97]

查询示例[4563,97,40]。

结果[87567,4563,97,40,87],[4563,97,40,87,76]但不是[4563,40,87,76,97]。

我可以在dict中存储整数列表集,并搜索查询整数列表的键,但这很慢。我可以将整数列表写入平面文件并使用grep来搜索它们,这很快但是讨厌的黑客。最终,我需要在结果(匹配列表)上运行更多代码,因此我更愿意保留在当前的python工作流程中。

我知道像aho corasick这样的搜索算法,但是我使用的是整数而不是文本而我正在反向(搜索整个字符串以查找子字符串)。

2 个答案:

答案 0 :(得分:1)

首先,我建议您查看https://wiki.python.org/moin/PythonSpeed/PerformanceTips

例如,根据您编写循环的方式,计算时间可能会有很大差异。

以下代码有效...... Quid of performance ???

#Your List of lists
L = [[1,40, 98, 32, 778], [7, 9347, 21, 98345, 632, 444], [87567, 4563, 97, 40, 87], [1, 40, 98, 32, 778], [4563, 97, 40, 87, 76], [935, 57342, 86, 213, 89674, 4327, 9641, 13283], [4563, 40, 87, 76, 97]]

#Your list of search items
query= [4563, 97, 40]


def queryInList(Q,l):
    lidx = []
    for q in Q:
        try:
            lidx.append(l.index(q))
            if lidx[len(lidx)-1] < lidx[len(lidx)-2]:
                return False
        except ValueError:
            return False
    return True



l = [l for l in L if queryInList(query, l)]
print l

答案 1 :(得分:0)

如果您能负担得起存储空间和预处理时间,您可以在三个不同的词典中插入列表中的所有三元组,四元组和五元组。字典条目将存储这些元组出现的列表集以及列表中的位置。

然后将按照与匹配数量成比例的时间执行查询。