一些在循环访问列表时应增加的for循环数减少

时间:2018-11-28 16:42:56

标签: python loops for-loop

我已经看了一段时间我的代码,而我只是迷住了混乱的地方,所以也许你们中的一个可以提供帮助。

我的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个。我不确定我在哪里搞砸了,所以如果有人能指出我正确的方向,我将非常感激,谢谢!

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。