Считать в обратном направлении

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
    Этот вопрос показывает, как перебирать список, используя скользящее окно. Остальное должно быть достаточно простым.
Теги:

5 ответов

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
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
    Очень многословно, не так ли?
  • 1
    Но гораздо более читабельным! :-) Даже если бы функция скользящего окна находилась в служебном модуле, я мог бы мгновенно выяснить, что делает функция testforcondition через год.
Показать ещё 2 комментария
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
    Где тест «вверх» после двух значений «вниз»?
  • 0
    Было уже поздно на вечеринку.
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
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
    То же самое и здесь: где тест для «вверх» после двух «вниз» значений?
  • 0
    @Martijn Pieters: я полностью пропустил это. Теперь я отредактировал свой ответ соответственно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню