在一系列列表

时间:2016-06-09 10:02:19

标签: python

你好, 我在finding missing elements in a list of integers找到了这个非常有用的话题。 我发现第二个答案最有用,现在我将它应用到我的代码中:

def missing_elements(X):
    start, end = X[0], X[-1]
    return sorted(set(range(start, end + 1)).difference(X))

现在,问题在于我没有列表,而是一系列列表,其中包含快照:

[716, 717, 718, 719, 720, 721]
[761, 762, 763, 764, 765, 766, 767, 768]
[988, 989, 990, 993, 994]

我希望看到的结果如下:

[0]
[0]
[991, 992]

显然,上面的代码不起作用。但我不知道如何让它发挥作用。我得到的印象是我可能想把它变成一个集合并用set type features做一些事情,但那只是猜测......

2 个答案:

答案 0 :(得分:1)

首先,作为一种更加pythonic的方式,您可以使用以下功能来检测丢失的项目,然后使用列表推导将该功能应用到您的列表中:

>>> from itertools import chain
>>> def missing(iterable):
...     return chain.from_iterable(range(i+1, j) for i, j in zip(iterable, iterable[1:]) if j > i + 1)

演示:

>>> lst = [[716, 717, 718, 719, 720, 721],
... [761, 762, 763, 764, 765, 766, 767, 768],
... [988, 989, 990, 993, 994]]
... 
>>> [list(missing(i)) for i in lst]
[[], [], [991, 992]]
>>> 

以下是建议功能的基准测试,显示此功能快2倍:

~ $ python -m timeit --setup "from itertools import chain; iterable=range(100)" "chain.from_iterable(range(i+1, j) for i, j in zip(iterable, iterable[1:]) if j > i + 1)"
100000 loops, best of 3: 3.68 usec per loop
~ $ python -m timeit --setup "iterable=range(100)" "start, end = iterable[0], iterable[-1]; sorted(set(range(start, end + 1)).difference(iterable))"
100000 loops, best of 3: 6.94 usec per loop

答案 1 :(得分:1)

只需map您现有的功能进入系列列表:

> lsts = [[716, 717, 718, 719, 720, 721],
          [761, 762, 763, 764, 765, 766, 767, 768],
          [988, 989, 990, 993, 994]]
> map(missing_elements, lsts)
[[], [], [991, 992]]