检查列表是否为python中的几何序列

时间:2015-10-11 22:08:05

标签: python list for-loop sequence

我有,

def geometric(lst):
'checks whether the integers in list lst form a geometric sequence'
    for i in range(1, len(lst) - 1):
        if lst[i] * 2  == "don't know what to check here":
            return True
        else:
            return False

我不知道如何应用它来检查是否所有指数。更喜欢在for循环中完成此操作。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:4)

我认为这有效:

def geometric(lst):
    for i in range(len(lst) - 2):
        if lst[i] * lst[i + 2] != lst[i + 1] ** 2:
            return False
    return True

这是基于以下观点:对于任何三个连续项a, b, c,前两个项之间的比率必须等于最后两个项之间的比率,即b/a = c/b。重新排列这会给a * c == b ** 2。使用没有除法的表单要好得多,因为除法引入了舍入错误。如果公共比率不是整数(例如[4, 6, 9]),则此函数甚至可以工作。

修改

上述答案无法正确处理包含0的列表。

正确的版本是:

def geometric(lst):
    for i in range(len(lst) - 2):
        if lst[i] * lst[i + 2] != lst[i + 1] ** 2:
            return False
    for i in range(len(lst) - 1):
        if lst[i] == 0 and lst[i + 1] != 0:
            return False
    return True

这会为True(公共比率[1, 0, 0])返回0,但为False返回[0, 0, 1]。原始版本为两者返回True

禁止共同口粮0可能更好。这意味着更改第二个循环以返回False长度2或更多包含0的列表。

答案 1 :(得分:1)

正如sam2090指出的那样,第4行条件的右侧是空的。如果几何序列的公共比率为2(可能是您实际想要作为函数的参数传递的东西),那么表达式应为:

if lst[i] == lst[i-1] * 2

语句的左侧是指迭代(i)中的当前数字,而语句的右侧是指前一个数字(i-1)并将其值乘以2。 / p>

此外,在foor循环中,请确保迭代到列表中的最后一个元素,因此您应该写:

for i in range(1, len(lst)):

而不是

for i in range(1, len(lst) - 1):