计算python列表中相邻项之间的差异

Mar*_*ark 13 python list

我有一个数百万的数字列表.我想知道有序列表中每个数字之间的差异是否与整个列表相同.

list_example = [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'
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

mtr*_*trw 16

使用纯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
Run Code Online (Sandbox Code Playgroud)

如果您使用NumPy,它会更容易,也可能更快:

>>> import numpy as np
>>> xdiff = np.diff(x)
>>> np.all(xdiff[0] == xdiff)
True
Run Code Online (Sandbox Code Playgroud)

但是这两个都创建了两个额外的列表(或NumPy的数组),如果你有数百万的数字,可能会吞噬你的可用内存.


Mar*_*riy 12

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

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...
Run Code Online (Sandbox Code Playgroud)


Rya*_* Ye 8

需要注意的是,该列表可能有数百万个数字.理想情况下,除非必要,否则我们不应迭代整个列表.我们还需要避免构造新的列表,这可能会占用大量内存.使用all和一个发生器将解决问题

 >>> 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
Run Code Online (Sandbox Code Playgroud)

  • 你计算两个元素之间差异的两倍,因为i = 2,n-2.也许你应该将差异提取到变量中,并与之进行比较. (3认同)

cdy*_*n37 5

itertools.izip非常适合这种事情:

>>> lst = [1,1,2,3,5,8]
>>> [y-x for x, y in itertools.izip (lst, lst[1:])]
[0, 1, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)