【问题标题】:Tuples of closed continuous intervals闭合连续区间的元组
【发布时间】:2014-11-26 02:42:56
【问题描述】:

假设我有以下数字列表:

my_array = [0, 3, 4, 7, 8, 9, 10, 20, 21, 22, 70]

我想在这个列表中找到包含连续整数且没有间隙的每个闭合区间。如果列表中的任何数字有多个这样的间隔,我们只保留最大的任何这样的间隔。上面的正确答案应该是:

[0,   0]
[3,   4]
[7,  10]
[20, 22]
[70, 70]

要查看此内容,请注意例如:

  • 闭区间[0,0]包含整数0,不包含任何间隙,并且其成员都不包含在任何其他闭区间中。

  • 闭区间[3,4] 不包含间隙,并且其成员不包含在任何其他没有大于自身的间隙的闭区间中。

我如何在 numpy 中做到这一点?我开始编写一个算法,使用np.diff(my_array) 来检测数组中的转换,但它在极端情况下失败,例如只包含一个项目的区间。

【问题讨论】:

  • 你怎么定义的,每一个闭合的连续区间??,规则是什么??
  • @Hackaholic 我大大扩展了 OP 以阐明我的意思。如果还不清楚,请告诉我。
  • 现在明白了,现在清楚了
  • 我会启动一个计数器并在列表中移动计数器。每当它停止时,它覆盖的所有数字都会得到一个连续的数字。将这些数字与列表中的原始数字一起放入字典中。然后打印特定计数的字典条目的最小值、最大值。
  • 为什么不用纯 python 编写代码。这是一个 15 行的实现。

标签: python algorithm numpy


【解决方案1】:

我没有方便的 numpy 安装,但这是我会采用的方法。首先分别处理空数组的情况。如果数组尚未排序,则对数组进行排序并使用np.diff 计算差异。

0, 3, 4, 7, 8, 9, 10,  20, 21, 22,  70
  3  1  3  1  1  1   10   1   1   48

测试是否为> 1

  1  0  1  0  0  0    1   0   0    1

要获取区间的开头,请在开头放置 1 并选择相应的数组项。要获得结束,请在末尾添加一个1,然后选择相应的数组项。

0, 3, 4, 7, 8, 9, 10,  20, 21, 22,  70
1  1  0  1  0  0   0    1   0   0    1
0  3     7             20           70

0, 3, 4, 7, 8, 9, 10,  20, 21, 22,  70
1  0  1  0  0  0   1    0   0   1    1
0     4           10           22   70

实施(主要由 user815423426 实施):

def get_intervals(my_array):
  my_diff = np.diff(my_array)>1
  begins  = np.insert(my_diff, 0, 1)
  ends    = np.insert(my_diff, -1, 1)
  return np.array(np.dstack((my_array[begins], my_array[ends])))

my_array = np.array([0, 3, 4, 7, 8, 9, 10, 20, 21, 22, 70])
> get_intervals(my_array)
array([[ 0,  0],
       [ 3,  4],
       [ 7, 10],
       [20, 22],
       [70, 70]])

【讨论】:

    【解决方案2】:

    纯python实现:

    def findContinuousIntervals(numbers):
        if not numbers:
            return []
    
        sortedNumbers = sorted(numbers)
    
        result = [(sortedNumbers[0], sortedNumbers[0])]
        for n in sortedNumbers:
            a, b = result[-1]
            if abs(b - n) <= 1:
                result[-1] = (a, n)
            else:
                result.append((n, n))
        return result
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 2015-01-15
      • 2013-06-29
      • 1970-01-01
      • 2019-04-08
      相关资源
      最近更新 更多