繁体   English   中英

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

[英]Finding the difference between consecutive numbers in a list (Python)

给定一个数字列表,我试图编写一个代码,找出连续元素之间的差异。 例如, 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: ])]

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

你可以做:

[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]

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

说明:

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

  • 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)]
  • 最后一步是简单地返回每个元组的差异。

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

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

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

[abs(j-A[i+1]) for i,j in enumerate(A[:-1])]

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

def deviation(A):
    yield 0
    for i in range(len(A) - 1):
        yield abs(A[i+1] - A[i])

例:

>>> A = [3, 5, 2]
>>> list(deviation(A))
[0, 2, 3]

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

def deviation(A):
    prev = A[0]
    for el in A:
        yield abs(el - prev)
        prev = el

你可以做一个列表理解:

>>> A = [1, 10, 100, 50, 40]
>>> l=[A[0]]+A
>>> [abs(l[i-1]-l[i]) for i in range(1,len(l))]
[0, 9, 90, 50, 10]

对于更长的递归解决方案,更符合您的原始方法:

def deviation(A) :
    if len(A) < 2 :
        return []
    else :
        return [abs(A[0]-A[1])] + deviation(A[1:])

您的括号问题与您的递归调用有关。 由于您在自己的[]括号中有[deviation(a[1: ])] ,因此每次递归调用都会创建一个新列表,从而导致列表中的许多列表。

要修复None问题,只需将基本案例更改为空列表[] 现在你的函数将在递归制作列表的末尾添加“nothing”,而不是return空白的固有None

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM