Python add / subtrair contra comparando passado para valores segundo ao último

votos
0

Eu estou tentando contar o número de itens em uma lista, adicionando / subtraindo dependendo de certas condições.

Para um pouco mais contexto: tenho controlador Midi que emite os dados Midi sempre que um botão é rodado. Independentemente de onde o botão é, eu quero contrariar para repor a 0, e como ele se transforma em uma direção, em seguida, aumentar o valor e diminuir em outra direção.

Cada mensagem midi produz algo como isto:

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

Então eu acho que posso verificar se as próximas mensagens recebidas ou é maior ou menor que a mensagem anterior.

O problema que eu estou correndo em é que ter um índice como:

second_to_last_message = messages[-2]

Automaticamente produz IndexError: índice de lista fora da faixa que faz sentido porque você pode obter o segundo ao último item em uma lista vazia. Mas eu não sei como posso verificar se o valor está aumentando ou diminuindo sem uma verificação assim ... sente como um catch-22.

Também não estou certo de que é a melhor maneira de implementar o contador. Eu ficaria grato por todas as idéias de como abordar isso.

CÓDIGO

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)

código atualizado

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)
Publicado 27/11/2018 em 17:55
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Você simplesmente precisa verificar se você tem a seguinte-à-último elemento antes de fazer referência a ela:

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
Respondeu 27/11/2018 em 18:00
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more