快速检查列表是否是嵌套列表的一个元素的子列表

时间:2013-11-08 22:58:00

标签: python performance list

作为SAT求解器的结果,我有一个逻辑公式模型的大嵌套int列表。 该列表有一百万个近似长度为30的子列表。

示例数据:

[[-1, -2, 3, -4, -5, 6, 7, -8, -9, -10, -11, -12, 13, 14, 15, -16, 17, -18, -19, -20, 21, 22, 23, 24, 25, -26, -27, 28, 29, 30, -31, 32, 33, -34, 35, 36, -37], [-1, -2, 3, -4, -5, 6, 7, -8, -9, -10, -11, -12, 13, 14, 15, -16, 17, -18, -19, -20, 21, 22, 23, 24, 25, -26, -27, 28, 29, 30, -31, 32, 33, -34, 35, 36, 37], [-1, -2, 3, -4, -5, 6, 7, -8, -9, -10, -11, -12, 13, 14, 15, -16, 17, -18, -19, -20, 21, 22, 23, 24, 25, -26, -27, 28, 29, 30, -31, 32, 33, 34, 35, 36, -37], [-1, -2, 3, -4, -5, 6, 7, -8, -9, -10, -11, -12, 13, 14, 15, -16, 17, -18, -19, -20, 21, 22, 23, 24, 25, -26, -27, 28, 29, 30, -31, 32, 33, 34, 35, 36, 37], [-1, -2, 3, -4, -5, 6, 7, -8, -9, -10, -11, -12, 13, 14, 15, -16, 17, -18, -19, -20, 21, 22, 23, 24, 25, -26, -27, 28, 29, 30, -31, 32, 33, 34, -35, 36, -37], [-1, -2, 3, -4, -5, 6, 7, -8, -9, -10, -11, -12, 13, 14, 15, -16, 17, -18, -19, -20, 21, 22, 23, 24, 25, -26, -27, 28, 29, 30, -31, 32, 33, 34, -35, 36, 37], [-1, -2, 3, -4, -5, 6, 7, -8, -9, -10, -11, -12, 13, 14, 15, -16, 17, -18, -19, -20, 21, 22, 23, 24, 25, -26, -27, 28, 29, 30, 31, 32, 33, 34, -35, 36, -37], [-1, -2, 3, -4, -5, 6, 7, -8, -9, -10, -11, -12, 13, 14, 15, -16, 17, -18, -19, -20, 21, 22, 23, 24, 25, -26, -27, 28, 29, 30, 31, 32, 33, 34, -35, 36, 37]]

我需要检查列表,例如[4,5,6]是否包含其中一个巢列表中的元素。

说我的清单是:

[ [5,12,46,4,99,6],[23,66,99,32,77] ]

如果我用

运行我的程序
[4,5,6]

它应该返回true

由于我需要使用不同的列表执行500次测试,因此我认为这个问题对于性能至关重要。

这是我的计划:

  • 对列表进行排序以检查
  • 对大型嵌套列表进行排序
  • 首先比较两个最小的数字(比如我搜索2,子列表以3开头,我可以继续下一个子列表)

或者是否有更好的方法,例如,使用dict?

(PS:因为我只是寻找正数,我之前要求this question去除所有负数。)

2 个答案:

答案 0 :(得分:3)

使用套装:

>>> data = [ [5,12,46,4,99,6],[23,66,99,32,77] ]
>>> set_data = [set(s) for s in data]
>>> set_data
[set([99, 4, 5, 6, 12, 46]), set([32, 66, 99, 77, 23])]
>>> myset = set([4,5,6])
>>> [myset.issubset(s) for s in set_data]
[True, False]

答案 1 :(得分:1)

不要使用不必要地在内存中创建全新列表的列表推导,使用带有any()的生成器表达式。使用Visser的代码作为起点:

>>> data = [ [5,12,46,4,99,6],[23,66,99,32,77] ]
>>> set_data = [set(s) for s in data]
>>> set_data
[set([99, 4, 5, 6, 12, 46]), set([32, 66, 99, 77, 23])]
>>> myset = set([4,5,6])
>>> any(myset.issubset(s) for s in set_data)
True