Счетчик сложения / вычитания в Python путем сравнения последних с последними значениями
Я пытаюсь подсчитать количество элементов в списке, добавляя / вычитая в зависимости от определенных условий.
Для некоторого большего контекста: у меня есть 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 ответ
Вам просто нужно проверить, есть ли у вас предпоследний элемент, прежде чем ссылаться на него:
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