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

后端 未结 6 2132
忘掉有多难
忘掉有多难 2020-12-20 17:48

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 outp

相关标签:
6条回答
  • 2020-12-20 17:58
    [abs(j-A[i+1]) for i,j in enumerate(A[:-1])]
    
    0 讨论(0)
  • 2020-12-20 18:00

    The simplest (laziest) solution is to use the numpy function diff:

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

    If you want the absolute value of the differences (as you've implied by your question), then take the absolute value of the array.

    0 讨论(0)
  • 2020-12-20 18:02

    You can do:

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

    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)]
    • The last step is simply returning the difference in each tuple.
    0 讨论(0)
  • 2020-12-20 18:09

    Actually recursion is an overkill:

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

    Example:

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

    EDIT: Yet, another, even simplier and more efficient solution would be this:

    def deviation(A):
        prev = A[0]
        for el in A:
            yield abs(el - prev)
            prev = el
    
    0 讨论(0)
  • 2020-12-20 18:18

    For a longer recursive solution more in line with your original approach:

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

    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 inherent None that comes with a blank return'

    0 讨论(0)
  • 2020-12-20 18:19

    You can do a list comprehension:

    >>> 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]
    
    0 讨论(0)
提交回复
热议问题