如何从btw列表元素的差异中恢复原始数据

时间:2015-09-21 16:51:07

标签: python

我试图获得列表元素之间的差异。然后用这个差异列表想要让它回来。

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

2 个答案:

答案 0 :(得分:3)

最简单的方法是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]

答案 1 :(得分:1)

你应该以某种方式记住列表中的第一项(在这种情况下为2),因为我们稍后在从diffs恢复时需要它。我更喜欢将其作为结果列表中的第一个元素。

您可以使用enumerate()遍历列表并跳过 0th 索引:

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

>>> for i, ele in enumerate(data[1:], 1):
...     string_diff.append(data[i - 1] - ele)
[2, -2, -2, -3]

如果您想要恢复原始列表,则应该通过替换两个列表来完全相反:

>>> data = [string_diff[0]]
>>> for i, ele in enumerate(string_diff[1:], 1):
...     data.append(data[i - 1] - ele)
[2, 4, 6, 9]