首页 > 解决方案 > Python通过比较倒数第二个值来加/减计数器

问题描述

我正在尝试根据某些条件通过添加/减去来计算列表中的项目数。

了解更多情况:我有一个 Midi 控制器,只要转动旋钮,它就会输出 Midi 数据。无论旋钮在哪里,我都想将计数器重置为 0,当它朝一个方向转动时,它会增加值并在另一个方向上减小。

每条 midi 消息都会输出如下内容:

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: list index out of range 这很有意义,因为您可以获得空列表中的倒数第二个项目。但是我不确定如何在没有这样的检查的情况下检查值是增加还是减少......感觉就像一个 catch-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)

标签: pythonlistcountmidimido

解决方案


您只需要在引用它之前检查是否倒数第二个元素:

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

推荐阅读