【问题标题】:Finding the largest delta between two integers in a list查找列表中两个整数之间的最大增量
【发布时间】:2010-08-07 01:20:20
【问题描述】:

我有一个整数列表,即:

values = [55, 55, 56, 57, 57, 57, 57, 62, 63, 64, 79, 80]

我试图找出两个连续数字之间的最大差异。

在这种情况下,它将是来自64->7915

数字可以是负数或正数、增加或减少或两者兼而有之。重要的是我需要找到两个连续数字之间的最大增量。

最快的方法是什么?这些列表可以包含数百到数千个整数。

这是我现在的代码:

prev_value = values[0]
largest_delta = 0

for value in values:
  delta = value - prev_value
  if delta > largest_delta:
    largest_delta = delta
  prev_value = value

  return largest_delta

有没有更快的方法来做到这一点?这需要一段时间。

【问题讨论】:

  • 如果增量都是负数,您的代码将失败;它返回零。
  • 不要忘记,如果它是一个真正庞大的列表,您也可以“扩展”——也就是说,让多个线程跨不同的块工作,这样您就可以使用机器上的所有内核。

标签: python list


【解决方案1】:
max(abs(x - y) for (x, y) in zip(values[1:], values[:-1]))

【讨论】:

  • 对于如此大的列表,使用itertools.izip 避免在内存中构造元组列表
  • 仍然无法适应这个“新”Ptyhon。我那优美易读的语言怎么了? :-)
  • @John - 但是负增量怎么可能是最大的呢?如果x - y = -15,那么y - x = 15。正值总是更大(更高),因此abs(delta) 是合适的。
  • @aaronasterling:在 Python 3.x 中,zip 不构造列表。我最初建议在 2.x 中使用 itertools.izip,但这并没有真正的帮助,因为切片会构建两个新列表。你可以使用itertools.islice 来解决这个问题。
  • @dan04。好点。您还可以通过不切片第二个列表来避免构建新列表之一。 zip(values[1:], values)。 zip 将在 values[1:] 终止时终止
【解决方案2】:

尝试使用timeit 模块对其中一些进行计时:

>>> values = [55, 55, 56, 57, 57, 57, 57, 62, 63, 64, 79, 80]
>>> max(values[i+1] - values[i] for i in xrange(0, len(values) - 1))
15
>>> max(v1 - v0 for v0, v1 in zip(values[:-1], values[1:]))
15
>>> from itertools import izip, islice
>>> max(v1 - v0 for v0, v1 in izip(values[:-1], values[1:]))
15
>>> max(v1 - v0 for v0, v1 in izip(values, islice(values,1,None)))
15
>>>

【讨论】:

    【解决方案3】:

    这更像是 Python itertools 帮助中出色的 recipes 的广告。

    在这种情况下,如上面链接的帮助中所示,成对使用。

    from itertools import tee, izip
    
    def pairwise(iterable):
        "s -> (s0,s1), (s1,s2), (s2, s3), ..."
        a, b = tee(iterable)
        next(b, None)
        return izip(a, b)
    
    values = [55, 55, 56, 57, 57, 57, 57, 62, 63, 64, 79, 80]
    
    print max(b - a for a,b in pairwise(values))
    

    【讨论】:

      【解决方案4】:

      使用reduce(我猜很难看)

      >>> foo = [5, 5, 5, 5, 8, 8, 9]    
      >>> print reduce(lambda x, y: (max(x[0], y - x[1]), y), foo, (0, foo[0]))[0]
      3
      

      【讨论】:

        【解决方案5】:

        Python 3.10 开始,新的pairwise 函数提供了一种在连续元素对之间滑动的方法,从而找到它们的每一个差异:

        from itertools import pairwise
        
        # values = [55, 55, 56, 57, 57, 57, 57, 62, 63, 64, 79, 80]
        max(abs(x-y) for x, y in pairwise(values))
        # 15
        

        pairwise的中间结果:

        pairwise([55, 55, 56, 57, 57, 57, 57, 62, 63, 64, 79, 80])
        # [(55, 55), (55, 56), (56, 57), (57, 57), (57, 57), (57, 57), ...]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-08
          • 1970-01-01
          相关资源
          最近更新 更多