2012-11-07 62 views
2

我只是想知道如何檢查,以確認一個數字列表是算術或不使用Python,所以無論列表中的每個項目之間是否有一個共同的數字。驗證算術序列python

回答

5

這是我會寫:

all((i - j) == (j - k) for i, j, k in zip(l[:-2], l[1:-1], l[2:])) 

你也許可以讓僅計算差異,一旦它更有效率,但如果你關心效率,你會使用numpy的和寫的:

np.all((a[:-2] - a[1:-1]) == (a[1:-1] - a[2:])) 

或者甚至(保存的切片):

np.all(a[:-2] + a[2:] == 2 * a[1:-1]) 

也許最簡潔的方法是使用numpy.diff,因爲它會自動轉換列表爲numpy的數組:

np.all(np.diff(l, 2) == 0) 
+0

非常完美謝謝! –

5

您可以使用numpy.diff如果你有機會到numpy

>>> a = numpy.array(range(1, 15, 2)) 
>>> numpy.diff(a) 
array([2, 2, 2, 2, 2, 2]) 

所以,你可以做

>>> d = numpy.diff(a) 
>>> not numpy.any(d-d[0]) 
True 

或甚至更好

>>> not numpy.any(numpy.diff(a, 2)) 
True 
+0

像高階差異一樣,我已經忘記了! – ecatmur

+0

嘿,不幸的是,我沒有訪問numpy :(很好的回答,雖然:) –

1

如果你的意思是一系列數字中的算術序列,每個數字只是等於前一個加上一些常量(如[1, 3, 5, 7][8, 18, 28, 38]但不是[1, 2, 4, 8][1, 3, 1, 5, 1, 7]),那麼你可能不應該過時。這是不可能的列表理解勝過這一點:

def is_arithmetic(l): 
    delta = l[1] - l[0] 
    for index in range(len(l) - 1): 
     if not (l[index + 1] - l[index] == delta): 
      return False 
    return True 
+0

列表理解會更糟糕,因爲它會產生一個列表然後扔掉(就像你調用'範圍')。但是,這些答案都不是列表解析 - 它們是生成器理解。 – Eric

1

這裏有一個解決方案,只計算差值一次:

from itertools import izip 

def is_arithmetic(seq): 
    gen = (i - j for i, j in izip(seq[:-1], seq[1:])) 
    diff = next(gen, None) # get the first element in the generator 
    return all(d == diff for d in gen) # check all the others are equal to it 

或者更含糊:

def is_arithmetic(seq): 
    gen = (i - j for i, j in izip(seq[:-1], seq[1:])) 
    return all(d == d0 for d in gen for d0 in gen) # wat 
1

關於檢查長什麼列表中所有差異的集合?

>>> alist = [3,9,15,21,27,33,39,45,51,57] 
>>> blist = [-7, -2, 3, 8, 13, 18, 23, 29] 
>>> 1 == len(set([alist[x + 1] - alist[x] for x in range(len(alist) - 1)])) 
True 
>>> 1 == len(set([blist[x + 1] - blist[x] for x in range(len(blist) - 1)])) 
False 
>>> 
0
def check_arith(lst): 

    l1 = len(lst) - 1 
    n= 2 

    dif = lst[1] - lst[0] 

    while(n<l1): 

     if (lst[n+1] - lst[n]) != dif: 
      return False 
     else: 
      n = n + 1 
    return True 

print(check_arith([5,10,15, 20, 25]))