如何在数组中找到最长的连续数字链

时间:2017-06-06 14:11:09

标签: python arrays

例如我们有[0, 1, 3, 5, 7, 8, 9, 10, 12, 13]

结果必须是7, 8, 9, 10,因为它们彼此相邻,是索引并且是连续的整数,并且此链也长于0, 1

英语不是我的第一语言,如果写作有点模糊,请原谅。

3 个答案:

答案 0 :(得分:5)

根据与增加计数(由itertools.groupby对象提供)的常量差异,使用itertools.count将项目分组为子序列,然后使用内置max获取最长的子序列在参数len上:

from itertools import groupby, count

lst = [0, 1, 3, 5, 7, 8, 9, 10, 12, 13]
c = count()
val = max((list(g) for _, g in groupby(lst, lambda x: x-next(c))), key=len)
print(val)
# [7, 8, 9, 10]

您可以在结果中包含组密钥(压缩为_),以进一步了解其工作原理。

答案 1 :(得分:1)

使用numpy模块的替代解决方案:

import numpy as np

nums = np.array([0, 1, 3, 5, 7, 8, 9, 10, 12, 13])
longest_seq = max(np.split(nums, np.where(np.diff(nums) != 1)[0]+1), key=len).tolist()    
print(longest_seq)

输出:

[7, 8, 9, 10]
  • np.where(np.diff(nums) != 1)[0]+1 - 获取应该拆分数组的元素的索引(如果2个连续数字之间的差异不等于1,例如3和{{ 1}})

  • 5 - 将数组拆分为子数组

https://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.diff.html#numpy.diff https://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.split.html

答案 2 :(得分:0)

代码

使用itertools.groupby(类似于@Moses Koledoye的答案):

groups = [[y[1] for y in g] for k, g in itertools.groupby(enumerate(iterable), key=lambda x: x[0]-x[1])]
groups
# [[0, 1], [3], [5], [7, 8, 9, 10], [12, 13]]

max(groups, key=len)
# [7, 8, 9, 10]

替代

考虑第三方工具more_itertools.consecutive_groups

import more_itertools as mit


iterable = [0, 1, 3, 5, 7, 8, 9, 10, 12, 13]
max((list(g) for g in mit.consecutive_groups(iterable)), key=len)
# [7, 8, 9, 10]