2016-03-20 1 views
2

В настоящее время я пытаюсь создать программу, которая берет ноты для скрипки и переводит данные заметки в позицию на строке, но моя проблема в том, что когда я спрашиваю, есть ли ключ острая или плоский, и сколько высевки или квартиры в этом ключе я считаю, что я делаю кучу утомительным, если/то такие утверждения, как:Как закодировать утомительный оператор if

if keysig == sharp and signum == 2: 
    note['LE'] == 'D4' 
    note['SC'] == 'A4' 

elif keysig == sharp and signum == 3: 
    note['LE'] == 'D5' 
    note['SC'] == 'G2' 

вы увидите, что он становится супер раздражает вернуться и сделать другое заявление с небольшими изменениями. Как я могу это исправить?

Для тех из вас, кто не читает ноты: В основном, я пытаюсь сказать, что этот алгоритм будет делать заметки, которые пользователь вводит, например, A, G или D, и превращает их в точные местоположения на щитке для скрипки, поэтому вам не придется вручную искать заметки. Эта программа предназначена для начинающих скрипки, у которых нет опыта чтения нот.

+1

В интересах тех из нас, кто не читает ноты, не могли бы вы объяснить здесь алгоритм? – Mureinik

+2

Попробуйте '{(sharp, 3): {'LE': 'D5', 'SC': 'G2'}} [keysig, signum]' – jonrsharpe

ответ

10

Вы можете использовать словарь:

transpositions = { 
    (sharp, 2): {'LE': 'D4', 'SC': 'A4'}, 
    (sharp, 3): {'LE': 'D5', 'SC': 'G2'}, 
    # etc. 
} 

note.update(transpositions.get((keysig, signum), {})) 

Это использует кортеж (keysig, signum) в качестве ключа, отображение конкретных нот транспозиций. Если такой сигнатуры не обнаружено, обновление не производится (обновление с помощью пустого словаря).

+0

Элегантное решение! Я буду помнить об этом для дальнейшего использования. :) – pixis