查找列表中连续数字之间的差异(Python)

use*_*443 4 python recursion deviation

给定一个数字列表,我试图编写一个代码,找出连续元素之间的差异.例如,A = [1, 10, 100, 50, 40]函数的输出应该是[0, 9, 90, 50, 10].这是我到目前为止尝试使用递归的内容:

def deviation(A):
    if len(A) < 2:
        return
    else:
        return [abs(A[0]-A[1])] + [deviation(A[1: ])]
Run Code Online (Sandbox Code Playgroud)

然而,我得到的输出(使用上面的A作为输入的例子)是[9, [90, [50, [10, None]]]].如何正确格式化括号?(我已经尝试过猜测和检查,但我这是我得到的最接近的)我怎么写它从前一个元素中减去当前元素而不会得到第一个元素的索引错误?我仍然希望输出列表的第一个元素为零,但我不知道如何使用递归来解决这个问题,并且由于某种原因,这似乎是我的最佳途径.

Fuz*_*uck 7

最简单(最懒)的解决方案是使用 numpy 函数 diff:

>>> A = [1, 10, 100, 50, 40]
>>> np.diff(A)
array([  9,  90, -50, -10])
Run Code Online (Sandbox Code Playgroud)

如果您想要差异的绝对值(正如您的问题所暗示的那样),则取数组的绝对值。


Mar*_*oun 6

你可以做:

[y-x for x, y in zip(A[:-1], A[1:])] 


>>> A = [1, 10, 100, 50, 40]
>>> [y-x for x, y in zip(A[:-1], A[1:])]
[9, 90, -50, -10]
Run Code Online (Sandbox Code Playgroud)

请注意,如果右侧较小,差异将为负,您可以轻松解决此问题(如果您认为这是错误的),我会为您留下解决方案.

说明:

您可以获得的最佳解释是打印列表理解的每个部分.

  • A[:-1] 返回没有最后一个元素的列表: [1, 10, 100, 50]
  • A[1:] 返回没有第一个元素的列表: [10, 100, 50, 40]
  • zip(A[:-1], A[1:]) 回报 [(1, 10), (10, 100), (100, 50), (50, 40)]
  • 最后一步是简单地返回每个元组的差异.

  • 你忘了`abs`,但无论如何都是+1. (2认同)

fre*_*ish 1

实际上递归是一种矫枉过正:

def deviation(A):
    yield 0
    for i in range(len(A) - 1):
        yield abs(A[i+1] - A[i])
Run Code Online (Sandbox Code Playgroud)

例子:

>>> A = [3, 5, 2]
>>> list(deviation(A))
[0, 2, 3]
Run Code Online (Sandbox Code Playgroud)

编辑:然而,另一个更简单、更有效的解决方案是这样的:

def deviation(A):
    prev = A[0]
    for el in A:
        yield abs(el - prev)
        prev = el
Run Code Online (Sandbox Code Playgroud)