我正在尝试获取列表元素之间的差异。然后,使用此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
-可以使用izip
和islice
函数避免一次构建所有列表。您还可以通过传递
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]