2

下面的代码工作得很好。但这似乎很冗长,肯定有更优雅的方法来计算这个吗?

这个想法是我有一个 100 个递增时间戳的列表,我想查看这些时间戳并计算每个时间戳之间的平均时间。

下面的代码起作用,但我敢肯定,像这样反转列表确实效率低下。

有什么建议么?

#!/usr/bin/python 

nums = [1,4,6,10]
print nums
nums_orig = list(nums)

nums_orig.pop()
nums.reverse()
nums.pop()
nums.reverse()

print nums
print nums_orig

total = 0

for idx, val in enumerate(nums):
  difference = val - nums_orig[idx]
  total += difference
  print idx, val - nums_orig[idx]

print "Mean difference is %d" % (total / len(nums))
4

3 回答 3

8

如果你有 numpy:

>>> import numpy as np
>>> np.diff([1,4,6,10]).mean()
3.0
于 2012-05-04T11:43:16.173 回答
6

你正在寻找的是

>>> nums = [1,4,6,10]
>>> [x-y for x,y in zip(nums[1:],nums)]
[3, 2, 4]
>>> delta=[x-y for x,y in zip(nums[1:],nums)]
>>> float(sum(delta))/len(delta)
3.0

使用星图的解决方案

>>> from itertools import starmap
>>> from operator import sub
>>> sum(starmap(sub,zip(nums[1:],nums)))/float(len(nums)-1)
3.0
于 2012-05-04T11:43:32.147 回答
3

这个想法是我有一个 100 个递增时间戳的列表,我想查看这些时间戳并计算每个时间戳之间的平均时间。

由于它们正在增加,因此差异之和只是第一个和最后一个之间的差异。同时,差异的数量只是比值的数量少 1。

所以不需要循环。只是:

(nums[-1] - nums[0])/(len(nums) - 1)
于 2012-05-04T13:00:34.450 回答