如何在Python循环迭代期间仅在范围内打印匹配的项目一次

时间:2016-11-21 16:47:46

标签: python loops for-loop range

我希望搜索我的数组[1,2,3,4,5]代表秒并检查我的时间变量't'(最初为0)是否与范围项匹配,此时我想要打印时间'只'一次。

循环将再次被读取,但这次不打印任何东西,除非找到另一个匹配 - 即。 t现在是2秒,所以当t = 2时,打印't'ONCE。

我如何在Python中实现这一目标?这就是我目前所拥有的:

t = 0
dt = 0.05

a = np.arange(1,5,1)

while t < 10:

for x in range(a.size):
    if int(t) == a[x,0]:
        print "TIME IS NOW >>>>>>>", int(t)

t = t+dt

这是有效的,除非它一次又一次地打印先前匹配的号码,直到找到新的匹配号码:

TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>1
TIME IS NOW >>>>>>>2
TIME IS NOW >>>>>>>2

依旧.....

我想要一个结果:

TIME IS NOW >>>>>>>1
-
-(looping but no print out)
TIME IS NOW >>>>>>>2
-
and so on...

3 个答案:

答案 0 :(得分:0)

你在这里处理浮点数,当你在其中一个中调用int时,得到的是该数字的最低点,即浮点数X.yyyy得到{ {1}}无论X如何,例如

yyyy

所以你得到一堆0,然后是一堆1,依此类推......

那么如何比较数字? 0.05 -> 0 0.55 -> 0 0.95 -> 0 1.25 -> 1 etc. 由于floats的精确问题总是很烦人但是有一个解决方法,而且检查某个边界内的数字有多近,检查很简单<{1}} / p>

==

您选择最方便的epsilon,例如abs(a-b) <= epsilon 1e-10,然后最终产品

1e-16

,输出

t = 0
dt = 0.05
check_point = range(1,6)

while t<10:
    if any( abs(t-x) <= 1e-10 for x in check_point ):
        print "TIME IS NOW >>>>>>>", t
    t += dt

答案 1 :(得分:0)

这两段代码都会起作用,虽然我仍然不知所措,为什么你希望以这种方式这样做。

此版本处理浮点数到数组中的2位小数

import numpy as np
a = np.arange(1,5,1)
t=0
while t < 10:
    if int(t) in np.unique(a):   #set(a) would work here too
        print "TIME IS NOW >>>>>>>", int(t)
        t=int(t)+1 #increment to next integer
    t+=0.05

这个只会处理整数值

{{1}}

答案 2 :(得分:0)

非常感谢答案,特别是'科波菲尔' - 你的epsilon边界检查让我找到更多关于浮点数的问题,虽然你的解决方案不能直接对我起作用我找到了一个使用Numpy的命令(因为我的数组是一个Numpy数组) - 'isclose'命令。这似乎可以解决您的解决方案所做的工作,并使用容差检查列表项以进行比较。

我的问题的正确解决方案是:

if np.isclose(insRate, t, atol=0.0001).any():
    print "TIME IS NOW >>>>>>>", t

再次感谢大家!