我正在尝试获取列表元素之间的差异。然后,使用此difference_list希望将其恢复。

data = [2,4,6,9]
string_diff = []

string = [data[0]]

def diff(x):
    for i in range(len(x) - 1):
        diff = x[i] - x[i+1]
        string_diff.append(diff)
    return string_diff
print diff(data)


输出是

[-2,-2,-3]


我做了一个新的字典“ string”,它已经具有原始数据的第一个值。我的想法是创建一个循环遍历并同时并行更新的列表,以便实现所需的目标。但我收到错误“列表索引超出范围”

def recover(x):
    for i in range(len(x)):
        r = string[i] - x[i]
        string.append(r)
    return string

Traceback (most recent call last):
  File "C:/Users/file.py", line 28, in <module>
    print recover(string_diff)
  File "C:/Users/file.py", line 23, in recover
    r = string[i] - x[i]
IndexError: list index out of range

最佳答案

最简单的方法是zip

def diff(lst):
    """Return the differences between the items in lst."""
    return [curr - prev for prev, curr in zip(lst, lst[1:])]


正在使用:

>>> diff([2, 4, 6, 9])
[-2, -2, -3]


请注意,此函数仅使用其显式参数lst,而不像当前尝试那样依赖作用域来访问string_diff。如果lst很长,请考虑使用itertools-可以使用izipislice函数避免一次构建所有列表。



您还可以通过传递recover仅使用显式参数来start

 def recover(diffs, start):
    """Recover the original list from start item and diffs."""
    return [start - sum(diffs[:index]) for index in range(len(diffs) + 1)]


正在使用:

>>> recover([-2, -2, -3], 2)
[2, 4, 6, 9]

09-30 15:29
查看更多