2011-05-26 35 views
1

我有這樣的組織的清單:「比較落後」倒計數

[('down', 0.0098000000000000309), 
('up', 0.0015000000000000568), 
('down', 0.008900000000000019), 
('down', 0.023300000000000098), 
('down', 0.011599999999999944), 
('down', 0.0027000000000000357), 
('up', 0.0023999999999999577), 
('up', 0.0065000000000000613), 
('down', 0.0057000000000000384), 
('down', 0.018400000000000083), 
('up', 0.009300000000000086), 
('down', 0.0038000000000000256), 
('down', 0.00050000000000005596), 
('up', 0.0082000000000000961), ..... 

什麼將是最好的方式,基本上我想返回「是」(或者其他)。如果我們得到了一系列2個「下降」,然後是一個「上升」,第二個值低於0.0095。

我希望他是有道理的..

+2

[這個問題](http://stackoverflow.com/questions/323750/)展示瞭如何使用滑動窗口來遍歷列表。其餘的應該很簡單。 – 2011-05-26 09:58:35

回答

3

這裏你去:

def frob(l): 
    downcount = 0 
    for ele in l: 
     if downcount >= 2 and ele[0] == 'up' and ele[1] < 0.0095: 
       return True 
     downcount = (downcount + 1) if ele[0] == 'down' else 0 
    return False 
0

這裏是我的嘗試:

def test(data): 
    for x in xrange(2, len(data)): 
    if data[x-2][0] is 'down' and data[x][x-1] is 'down' and data[x][0] is 'up' and data[x][1] < 0.0095: 
     return True 
    return False 
+0

兩個「向下」值之後的「向上」測試在哪裏? – 2011-05-26 10:12:34

+0

晚會到了晚會。 – sje397 2011-05-26 10:13:42

0

我的建議(雖然現在與第三片,這是不是真的漂亮了):

def compback(l): 
    return any(i1[0] == i2[0] == "down" 
       and i2[1] < 0.0095 
       and i3[0] == "up" 
       for i1, i2, i3 in zip(l, l[1:], l[2:])) 
+0

同一個地方:兩個「向下」值之後的「向上」測試在哪裏? – 2011-05-26 10:12:56

+0

@Martijn彼得斯:我完全忽略了這一點。我現在已經編輯了我的答案。 – 2011-05-26 10:26:50

5

上創建一個滑動窗口,並測試:

def slidingwindow(iterable): 
    iterator = iter(iterable) 
    first, second = iterator.next(), iterator.next() 
    for next in iterator: 
     yield (first, second, next) 
     first, second = second, next 

def testforcondition(data): 
    for window in slidingwindow(data): 
     direction = [w[0] for w in window] 
     if direction == ['down', 'down', 'up'] and window[2][1] < 0.0095: 
      return True 
    return False 
+0

非常詳細是不是? – sje397 2011-05-26 10:14:50

+1

但更可讀! :-)即使滑動窗口函數存在於一個實用程序模塊中,我也能夠立即明白testforcondition函數在一年後做了什麼。 – 2011-05-26 10:36:09

+0

只是表明,可讀性通常是一種主觀的質量。 – sje397 2011-05-26 10:38:40

0
for index in xrange(0, len(list) - 2): 
    if list[index][0] == 'down' and list[index + 1][0] == 'down' and list[index + 2][0] == 'up' and list[index + 1][1] < 0.0095: 
     return True