2016-03-20 51 views
2

我目前正在試圖製作一個程序,它將小提琴的樂譜轉換爲字符串上的位置,但是我的問題是,當我詢問一個鍵是鋒利或扁平,有多少銳器或單位是在關鍵的簽名我發現我做了一堆繁瑣的if/then語句,如:如何循環繁瑣的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