python - 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)
解决方案
您只需要在引用它之前检查是否有倒数第二个元素:
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
推荐阅读
- angularjs - AngularJS:服务完成异步请求后如何初始化组件
- css - 无法使用 Tailwindcss 使表单居中
- javascript - 如何正确地将连接的组件从基于类的组件迁移到 TS 上的功能组件?
- python - 检查影响 QListWidget 中特定项目集的项目
- java - 在Java中使用双圈链表将大小数相乘
- r - 需要帮助将带有 rvest 的表解析为数据框
- c# - 如何在c#中没有开店时跳过一天
- c# - 如何忽略 NuGet NU1605?
- mysql - 如果我添加 LIKE 我想要我的查询计数的相同输出
- oauth-2.0 - 为 Google 助理关联帐户时,身份验证代码交换中 IdP 的错误响应