【发布时间】: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 开始,相对于旋钮所在的位置。感谢您的提示,我将函数移出循环。
标签: python list count midi mido