计算Python列表中相邻项的差异

19 投票
9 回答
45513 浏览
提问于 2025-04-17 00:15

我有一个包含数百万个数字的列表。我想知道这个有序列表中每个数字之间的差值是否在整个列表中都是一样的。

列表示例 = [ 0, 5, 10, 15, 20, 25, 30, 35, 40, ..等等等等]

有什么好的方法来做到这一点吗?

我尝试过:

import collections

list_example = [ 0, 5, 10, 15, 20, 25, 30, 35, 40 ]

count = collections.Counter()

for x,y in zip(list_example[0::],list_example[1::]):
    print x,y,y-x
    count[y-x] +=1

if len( count ) == 1:
    print 'Differences all the same'

结果:

0 5 5
5 10 5
10 15 5
15 20 5
20 25 5
25 30 5
30 35 5
35 40 5
Differences all the same

9 个回答

9

需要注意的是,这个列表可能有几百万个数字。所以,理想情况下,我们不应该在没有必要的情况下遍历整个列表。此外,我们还需要避免创建新的列表,因为这可能会消耗大量内存。使用所有的数字和生成器可以解决这个问题。

 >>> x = [5, 10, 15, 20, 25]
 >>> all(x[i] - x[i-1] == x[i+1] - x[i] for i in xrange(1, len(x) - 1))
 True
28

使用纯Python:

>>> x = [0,5,10,15,20]
>>> xdiff = [x[n]-x[n-1] for n in range(1,len(x))]
>>> xdiff
[5, 5, 5, 5]
>>> all([xdiff[0] == xdiff[n] for n in range(1,len(xdiff))])
True

如果你用NumPy的话,会简单一点,而且可能更快:

>>> import numpy as np
>>> xdiff = np.diff(x)
>>> np.all(xdiff[0] == xdiff)
True

不过这两种方法都会额外创建两个列表(在NumPy的情况下是数组),如果你有几百万个数字的话,这可能会占用你很多内存。

10

这里最直接的方法是最好的:

x = s[1] - s[0]
for i in range(2, len(s)):
    if s[i] - s[i-1] != x: break
else:
    #do some work here...

撰写回答