你好, 我在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做一些事情,但那只是猜测......
答案 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]]