我已经看了一段时间我的代码,而我只是迷住了混乱的地方,所以也许你们中的一个可以提供帮助。
我的for循环应该做的是:遍历一长串时间。它将前100次平均,并将其设置为一个值。这部分有效。接下来应该做的是在t上加一个(我在for循环中使用的值),这样它将对第1次和第101次进行平均,如果该平均速度快不到0.1秒,则将t值加到a x值列表,然后将该值设置为要击败的新平均值。如果不降低0.1,我们将t增加,然后重试直到起作用。
这是我的代码,我将带您了解使其更具可读性的含义
for t in times:
t = int(t)
sumset = sum(times[t:t + 100])
avgset = (int(round(float(sumset/100), 3) * 10)) /10
if t + 100 > len(times):
break
elif (avgset) <= firstavg - .1:
avglist.append(avgset)
firstavg -= .1
xlist.append(t)
print(t)
print("avgset is "+str(avgset))
print("should decrease by .1 " + str(math.ceil(firstavg * 10) / 10))
tlist.append(t)
t += 1
else:
t += 1
我会在这里解释。
for t in times:
t = int(t)
sumset = sum(times[t:t + 100])
avgset = (int(round(float(sumset/100), 3) * 10)) /10
对于列表中称为times的每个值,我们采用该值并确保它是一个int,之所以这样做,是因为之前我遇到了一个索引问题,说它不是int。 Sumset得到我们需要的前100次的总和,而avgset将其求平均值,再乘以10,使用int截取小数,再除以10得到十分之一的值。
Ex
12.34 * 10 = 123.4, int(123.4) = 123, 123 / 10 is 12.3.
然后在这里
if t + 100 > len(times):
break
如果没有循环结束,我们确保还有100个值可以迭代。
在这个大块上
elif (avgset) <= firstavg - .1:
avglist.append(avgset)
firstavg -= .1
xlist.append(t)
print(t)
print("avgset is "+str(avgset))
print("should decrease by .1 " + str(math.ceil(firstavg * 10) / 10))
tlist.append(t)
t += 1
我们检查:如果集合小于等于第一个平均值-.1,则将那个平均值集合附加到降低的平均值列表中。然后,我们减少第一个平均值,并将t的值附加到将构成x值的列表中。它应该做的是为我提供一个x值列表,其中每个值对应于原始平均值(t:t +100)在t为0时减少了0.1。然后我们得到一个y列表(即avglist),每减少1个。我不确定我在哪里搞砸了,所以如果有人能指出我正确的方向,我将非常感激,谢谢!
答案 0 :(得分:1)
我认为您的代码中有很多要解决的问题:
1)主要也是最重要的是,您要将列表(浮动元素)中的元素与它们的索引(即,它们在列表中的位置)混合在一起。您想要的是遍历索引,而不是遍历元素本身。我的意思是给定列表:
my_list = [5.67, 4.23, 7.88, 9.5]
[5.67, 4.23, 7.88, 9.5]
的索引分别为:0,1,2,3
。 Python希望使用整数进行迭代,因为它会将这些数字解释为元素在列表中的位置,而不管它们的值如何。而且,排名显然必须始终为整数,即您是第4位或第5位,而不是第4.23位。但是,这并不意味着元素本身的值必须是整数。为了解决这种差异,有python内置函数enumerate()
:
>>> for index, value in enumerate([5.67, 4.23, 7.88, 9.5]):
... print (index, '->', value)
...
0 -> 5.67
1 -> 4.23
2 -> 7.88
3 -> 9.5
>>>
这就是为什么您需要将值(而不是索引)转换为整数,并乘以10的技巧,以便不丢失用于比较的0.1分辨率的原因。您可以忘记所有这些。
2)您实际上并不需要在每次迭代中检查列表中是否还剩下100个元素。迭代到第-100个元素就足够了:
for index, time in enumerate(times[:-100]):
,它将自动在-100处停止。但是,在执行此操作时,请记住要始终使用index
作为迭代器变量,而不是time
。此外,在另一个for
循环中,您可能会在其他情况下使用,如果需要检查是否满足某些条件来处理当前元素,并且如果不跳到下一个,则应使用{{1} }代替continue
:
break
for index, time in enumerate(times):
if index+100 > len(times):
continue
将您带出continue
语句,并带您进入if
循环,准备迭代下一个元素。 for
将打破break
循环并停止迭代。
3)在每次迭代的最后,您都有一个
for
这在很多方面都是错误的:
3.1)首先是因为您在迭代器中,并且elif (...):
...
t += 1
else:
t += 1
引用了要用于迭代的变量。您根本不需要告诉迭代器在每次迭代结束时将1加到迭代变量中。这样做是其职责之一。它知道。
3.2)假设循环中确实需要手动增加一个其他控制变量,那么您正在重复代码行。如果删除t
子句并删除else
子句最后一行的缩进,基本上可以得到相同的效果:
elif
因此该算法将落入elif (...):
...
t += 1
子句是否得到满足的t +=1
领域。
3.3)这与上面的项目符号1)有关:在您的特定情况下,并且由于您错误地使用elif
进行迭代(如上所述),因此通过执行t
来修改列表您进行迭代,即您正在更改输入数据。
考虑到所有这些,粗略实现代码的一种可能方法是:
t += 1
结果(随机生成输入数据):
import numpy as np
times = 100*np.random.rand(150)
list_of_avgs = [np.sum(times[:100])/100.]
for index, element in enumerate(times[:-100]):
avg = np.sum(times[index:index+100])/100.
if avg + 0.1 <= list_of_avgs[-1]:
list_of_avgs.append(avg)
else:
continue
print (list_of_avgs)
干杯,祝你好运!
D。