Python通过比较倒数第二个值来加/减计数器

Posted

技术标签:

【中文标题】Python通过比较倒数第二个值来加/减计数器【英文标题】:Python add/subtract counter by comparing last to second-to-last values 【发布时间】:2018-11-27 17:55:42 【问题描述】:

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

关于更多上下文:我有一个 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)

【问题讨论】:

有没有办法从控制器读取旋钮的当前值?您需要一种方法来初始化数据以可靠地执行此类操作。另外,你不应该在循环体中定义你的辅助函数。 @JonahBishop 我可以从 0 到 127 读取旋钮的值,但这些不一定是我需要的数字。我希望它从 0 开始,相对于旋钮所在的位置。感谢您的提示,我将函数移出循环。 【参考方案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

【讨论】:

感谢@Prune 的回复。我更新了帖子中的代码。这就是您所说的“继续使用其余代码”的意思吗?它似乎正在工作。我看到这些值增加和减少。但是一旦我再次尝试增加,我就会收到 – ValueError: list.remove(x): x not in list 这意味着你有一个单独的问题,应该(1)自己调试它; (2) 如果您遇到困难,请发布一个新问题。更改已发布问题的功能并不是一件好事,尤其是在您收到有效答案之后。 这是一个有效的答案,没关系。刚刚提出了一个我以前没有遇到过的新问题。希望对导致问题的原因有一些提示/方向。努力学习。

以上是关于Python通过比较倒数第二个值来加/减计数器的主要内容,如果未能解决你的问题,请参考以下文章

为啥倒数第二个值被复制到数组的最后一个值上[重复]

随堂作业

列表常规操作

输出链表的倒数第K个值

通过解析数组的值来计数数组

数字电路制作一个加减计数器