2012-11-30 64 views
0

問題是:改變輸出比特

voting_borda: 

(STR的列表的列表) - >的(STR,INT的列表)元組

的參數是的4元素列表的列表代表單次騎行的等級選票。

Borda Count是根據排名分配點數來確定的。一方獲得每個第一選擇排名3分,每個第二選擇排名2分,每個第三選擇排名1分。 (沒有積分排名第四。)例如,上面顯示的排名投票將貢獻3分給通精計數,2分給綠色計數和1分到CPC計數。得分最多的一方贏得了席位。

返回一個元組,其中第一個元素是根據博爾達計數和第二個元素是一個包含每個方點總數的四元素列表中獲勝的一方的名字。列表元素的順序對應於PARTY_INDICES中各方的順序。

這是我的代碼:

def voting_borda(*args): 
results = {} 
for sublist in args: 
    for i in range(0, 3): 
     if sublist[i] in results: 
      results[sublist[i]] += 3-i 
     else: 
      results[sublist[i]] = 3-i 

winner = max(results, key=results.get) 
results_sort = sorted(results,key=lambda x:x[1],reverse=True) 
return winner, results_sort 

但是,如果我嘗試

voting_borda(['GREEN','NDP', 'LIBERAL', 'CPC'],['GREEN','CPC','LIBERAL','NDP'],['LIBERAL','NDP', 'CPC', 'GREEN']) 

我得到的,

('GREEN', {'NDP': 4, 'CPC': 3, 'GREEN': 6, 'LIBERAL': 5}) 

但是,我想第一個參數是贏家(該部分是好的),第二個參數只是值,也是按照PARTY_INDICES的順序是 PARTY_INDICES = [NDP_INDEX, GREEN_INDEX, LIBERAL_INDEX, CPC_INDEX]

任何解決方案或方法,我可以做得更好?

+0

要麼這是功課或[這傢伙(http://stackoverflow.com/questions/13546205/how-to-shorten-this-code-without-using-一堆的if語句/)擊敗你。 – engineerC

+0

很多人在同一班。 http://stackoverflow.com/questions/13505169/how-to-append-the-number-of-item-frequencies-in-a-list-in-python-3-2/13505225#13505225 – sberry

+0

我做到了那一個已經!但這個問題是從一個 – user1864828

回答

1

索引事物(NDP_INDEX等)實際上是不必要的和非pythonic。只要使用該字符串,並且如果您需要根據某些內容進行排序,請使用元組列表。

vv = [ ('republican',3), ('democrat',9), ('libertarian',73), ('green',-2) ] 
vsort = sorted(vv,key=lambda x:x[1],reverse=True) 
print(list(party for party, value in vsort)) 

你可以做something similar得到你的答案。討厭做整個指派你...

+0

你能解釋一下key = lambda是什麼,我們還沒有得知! – user1864828

+0

lambda函數是一個未命名的內聯函數。 'lambda x:x [1]'相當於'def f(x):return x [1]'。它告訴排序按照每個元組的第二個元素對函數進行排序。 (psst閱讀我鏈接的頁面) – engineerC

+0

有沒有更簡單的方法?我是一個真正的初學者,我們還沒有學會reverse = True,要麼:*(這是令人沮喪的 – user1864828