我试图获得列表元素之间的差异。然后用这个差异列表想要让它回来。
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
答案 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
- 可以使用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]
答案 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]