Счетчик сложения / вычитания в Python путем сравнения последних с последними значениями - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь подсчитать количество элементов в списке, добавляя / вычитая в зависимости от определенных условий.

Для большего контекста: у меня есть Midi-контроллер, который выводит Midi-данные при каждом повороте ручки.Независимо от того, где находится ручка, я хочу, чтобы счетчик сбрасывался на 0, и, когда он поворачивается в одном направлении, затем увеличивает значение и уменьшает в другом направлении.

Каждое миди-сообщение выдает что-то вроде этого:

control_change channel=0 control=16 value=5 time=0
control_change channel=0 control=16 value=6 time=0
control_change channel=0 control=16 value=7 time=0

Итак, я полагаю, я могу проверить, больше или меньше следующие полученные сообщения, чем предыдущее сообщение.

Проблема, с которой я сталкиваюсь, заключается в том, что такой индекс имеет вид:

second_to_last_message = messages[-2]

Автоматически создает IndexError: список индексов выходит за пределы допустимого диапазона, что имеет смысл, поскольку вы можете получить второй за последнимэлемент в пустом списке.Но я не уверен, как я могу проверить, увеличивается ли значение или уменьшается без такой проверки ... похоже на уловку-22.

Также я не уверен, как лучше реализовать счетчик.Буду признателен за любые идеи, как к этому подойти.

КОД

messages = []
for msg in inport:

   def add(msg):
       messages.append(msg)

   def subtract(msg):
       messages.remove(msg)

   last_message = msg
   second_to_last_message = messages[-2]

   if last_message.value > second_to_last_message.value:
       add(msg)
       print len(messages)


   elif last_message.value < second_to_last_message.value:
       subtract(msg)
       print len(messages)

ОБНОВЛЕННЫЙ КОД

messages = []
def add(msg):
    messages.append(msg)

def subtract(msg):
    messages.remove(messages[-1])

for msg in inport:
    if len(messages) < 2:
        add(msg)
        print len(messages)

    else:
        last_message = msg
        second_to_last_message = messages[-2]

        if last_message.value > second_to_last_message.value:
            add(msg)
            print len(messages)

        elif last_message.value < second_to_last_message.value:
            subtract(msg)
            print len(messages)

1 Ответ

0 голосов
/ 27 ноября 2018

Вам просто нужно проверить, есть ли у следующий за последним элемент, прежде чем ссылаться на него:

if len(messages) < 2:    # Not enough messages accumulated: 
                         #   add this one without checking the value
   add(msg)
   print len(messages)

else:
   second_to_last_message = messages[-2]
   # Continue with the rest of your code
...