Given a list of numbers, I am trying to write a code that finds the difference between consecutive elements. For instance, A = [1, 10, 100, 50, 40]
so the output of the function should be [0, 9, 90, 50, 10]
. Here is what I have so far trying to use recursion:
def deviation(A):
if len(A) < 2:
return
else:
return [abs(A[0]-A[1])] + [deviation(A[1: ])]
The output I get, however, (using the above example of A as the input) is [9, [90, [50, [10, None]]]]
. How do I properly format my brackets? (I've tried guessing and checking but I this is the closest I have gotten) And how do I write this where it subtracts the current element from the previous element without getting an index error for the first element? I still want the first element of the output list to be zero but I do not know how to go about this using recursion and for some reason that seems the best route to me.
Actually recursion is an overkill:
Example:
EDIT: Yet, another, even simplier and more efficient solution would be this:
You can do:
Note that the difference will be negative if the right side is smaller, you can easily fix this (If you consider this wrong), I'll leave the solution for you.
Explanation:
The best explanation you can get is simply printing each part of the list comprehension.
A[:-1]
returns the list without the last element:[1, 10, 100, 50]
A[1:]
returns the list without the first element:[10, 100, 50, 40]
zip(A[:-1], A[1:])
returns[(1, 10), (10, 100), (100, 50), (50, 40)]
You can do a list comprehension:
For a longer recursive solution more in line with your original approach:
Your bracket issue is with your recursive call. Since you have your
[deviation(a[1: ])]
in its own[]
brackets, with every recursive call you're going to be creating a new list, resulting in your many lists within lists.In order to fix the
None
issue, just change your base case to an empty list[]
. Now your function will add 'nothing' to the end of your recursively made list, as opposed to the inherentNone
that comes with a blankreturn
'The simplest (laziest) solution is to use the numpy function diff:
If you want the absolute value of the differences (as you've implied by your question), then take the absolute value of the array.