验证算术序列python

时间:2012-11-07 18:53:16

标签: python math sequence verify

我只是想知道如何使用python来验证数字列表是否是算术运算,因此列表中的每个项目之间是否存在公共数字。

6 个答案:

答案 0 :(得分: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)

答案 1 :(得分:5)

如果您有权使用numpy

,则可以使用numpy.diff
>>> 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

答案 2 :(得分:1)

如果你的意思是一系列数字中的算术序列,那么每个数字只是等于前一个数加上一些常数(如[1, 3, 5, 7][8, 18, 28, 38]而不是{{1}或者[1, 2, 4, 8])那么你可能不应该过度思考它。列表理解不太可能优于此:

[1, 3, 1, 5, 1, 7]

答案 3 :(得分: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

答案 4 :(得分: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
>>> 

答案 5 :(得分: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]))