我有12个数字组成的数组。我正在尝试创建一个将前三个取平均值的循环。然后比较是否小于接下来的三个和之后的三个,依此类推。
我已经尝试过elif,但是要说明的条件太多了
result
date zone_a zone_b zone_c
1 11:00 1 4 0
2 12:00 2 0 0
3 13:00 3 5 6
4 15:00 0 0 7
import numpy as np
import math
array = [1,2,3,4,5,6,7,8,9,10,11,12]
for k in range(len(array)):
target1 = array[k]
target2 = array [k-1]
if k<11:
target3 = array[k+1]
else:
target3 = array[0]
targets = [target1, target2, target3]
target = np.mean(targets)
sigma = 1
if ((target-avg)/(math.sqrt(target))>= sigma:
print(array[k])
答案 0 :(得分:0)
首先,定义平均值函数,该函数计算可迭代对象中值的平均值:
def average(iterable):
sum = 0
for number in iterable:
sum += number
return sum / len(iterable)
此功能非常简单。它定义了一个名为“ sum”的变量,并将其初始值设置为0。然后遍历参数“ iterable”,将每个元素的值加到iterable参数中求和。然后,将所有值的总和(变量sum)除以iterable的长度。它以浮点数形式返回结果。
一个例子:该函数被调用。可迭代参数被分配给列表[25、75,-100、20]。将sum变量初始化为0。通过在iterable上循环,将25、75,-100和20相加。总和最终为20。按照Python的len()方法,可迭代的长度为4。20/4 = 5.0(浮点数,因为Python中的一个斜线始终代表真除法,即使结果仍然保留,也返回浮点数强制转换为int后相同。使用两个斜杠进行整数除法),因此该方法返回5.0。
返回您的程序。我认为,在比较它们之前,您应该获得所有平均值。定义平均值列表,如下所示。
averages = []
非常简单。将全局变量“平均值”设置为空列表。
因为您需要每三个数字的平均值,所以应该使迭代范围的步长为3,而不是1。此操作如下。
for counter in range(0, len(array), 3):
范围构造函数最多接受三个参数(开始,停止,步骤)。当它包含三个参数时,它将从“开始”开始计数,以“步进”开始计数,并在“停止”处停止。它记录了一个不变的可迭代对象中计数的每个数字。当包含两个参数时,“ step”设置为1。当包含一个参数时,“ start”设置为0,“ stop”设置为参数,“ step”设置为1。>
然后,您要将所有平均值附加到列表“平均值”中。操作如下。
averages.append(average(array[counter: counter+3: 1]))
列表的“ append”方法将其采用的参数添加到列表的末尾。 [counter:counter + 3:1]是切片索引。 slice构造函数与range相似,但可以使用以下格式来完成:start:stop [:step]且不可迭代,而是从可迭代对象中获取多个元素,并且这些索引由参数确定。值的平均值记录在平均值数组中。
您现在已获得所有平均值。无需担心IndexError,因为切片会忽略任何超出范围的索引而不会引发异常。
接下来,我们要比较平均值。这是代码:
for i in range(0, len(averages)):
for j in range(0, len(averages)):
if i == j:
#Avoid duplicate averages.
continue
if averages[i] < averages[j]:
#averages[i] < averages[j].
#Do something
continue
elif averages[i] == averages[j]:
#averages[i] == averages[j].
#Do something
continue
else:
#averages[i] > averages[j]. Only possibility left.
#Do something
continue
就是这样。我们对平均值而不是平均值本身进行迭代,以测试重复项。如果索引彼此相等,那么我们将继续循环,因为我们不想处理它们。否则,我们将averages [i]与averages [j]比较,并根据条件执行python语句。您没有指定要执行的操作,所以我只是将它们当作重复项来处理,尽管您不应该这样做。其余代码不言自明。
现在,获取完整代码。没有评论:
def average(iterable):
sum = 0
for number in iterable:
sum += number
return sum / len(iterable)
#Same old array that you mentioned in your question
array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
averages = []
for counter in range(0, len(array), 3):
averages.append(average(array[counter: counter+3: 1]))
for i in range(0, len(averages)):
for j in range(0, len(averages)):
if i == j:
#Avoid duplicate averages.
continue
if averages[i] < averages[j]:
#averages[i] < averages[j].
#Do something
continue
elif averages[i] == averages[j]:
#averages[i] == averages[j].
#Do something
continue
else:
#averages[i] > averages[j]. Only possibility left.
#Do something
continue
我通过用此代码在两个不同的平均值之间打印结果来测试我的代码。
def average(iterable):
sum = 0
for number in iterable:
sum += number
return sum / len(iterable)
#Same old array that you mentioned in your question
array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
averages = []
for counter in range(0, len(array), 3):
averages.append(average(array[counter: counter+3: 1]))
for i in range(0, len(averages)):
for j in range(0, len(averages)):
if i == j:
#Avoid duplicate averages.
continue
if averages[i] < averages[j]:
#averages[i] < averages[j].
#Do something
print("averages[{}] < averages[{}]".format(i, j))
elif averages[i] == averages[j]:
#averages[i] == averages[j].
#Do something
print("averages[{}] = averages[{}]".format(i, j))
else:
#averages[i] > averages[j]. Only possibility left.
#Do something
print("averages[{}] > averages[{}]".format(i, j))
print("Averages: ", averages)
这是输出。运行上面的测试代码,您将获得相同的结果。
averages[0] < averages[1]
averages[0] < averages[2]
averages[0] < averages[3]
averages[1] > averages[0]
averages[1] < averages[2]
averages[1] < averages[3]
averages[2] > averages[0]
averages[2] > averages[1]
averages[2] < averages[3]
averages[3] > averages[0]
averages[3] > averages[1]
averages[3] > averages[2]
Averages: [2.0, 5.0, 8.0, 11.0]
注意:我在Python 3.7中对此进行了编码