我有一个简单的函数,它读入两个纬度,如果它们彼此靠近,它将返回“空闲”
def is_idle(lat1, lat2):
if lat1 - lat2 < 0.1:
return 'idle'
elif lat1 - lat2 > 0.1:
return 'active'
else:
return 'error'
我如何在循环中将它应用于python循环中的行对?
答案 0 :(得分:1)
def is_idle(lat1, lat2):
if lat1 - lat2 < 0.1:
return 'idle'
elif lat1 - lat2 > 0.1:
return 'active'
else:
return 'error'
lats = [1,2,3,4,5,6,7,8,9]
for i in range(len(lats)-1):
lat1= lats[i]
lat2 = lats[i+1]
is_idle(lat1,lat2)
答案 1 :(得分:1)
另一个选择是使用map和lambda和zip而不是for循环:
lats = [1,2,3,4,5,6,7,8,9]
L = zip(lats[:-1], lats[1:]) # L = [(1,2),(2,3), ...]
map(lambda l: is_idle(l[0],l[1]), L)
或
map(lambda l: is_idle(*l), L)
答案 2 :(得分:1)
我意识到最初的问题是关于for循环,但我建议这是一个很好的例子,说明何时不使用for loop
。
这是我的解决方案:
def is_idle2(e):
if e > 0.1:
return 'idle'
elif e < 0.1:
return 'active'
return 'error'
lats = pd.Series([5, 2, 1, 4, 5, 6]*100000)
(lats - lats.shift(1)).dropna().map(is_idle2)
时序:
#my solution
%timeit (lats - lats.shift(1)).dropna().map(is_idle2)
10 loops, best of 3: 185 ms per loop
#Currently accepted solution
%%timeit
for i in range(len(lats)-1):
lat1= lats[i]
lat2 = lats[i+1]
is_idle(lat1,lat2)
1 loops, best of 3: 15.8 s per loop
在没有for循环的情况下执行此操作,在体积适中的系列上快了大约100倍。