2012-11-25 40 views
0

我試圖編寫一個練習的代碼,雖然它的工作方式應該如此,但它看起來很可怕,我想知道是否有人可以幫助我刪除任何不必要的東西,並且可能只是結合一些功能?在列表中添加項目 - Python

下面是使用功能的一個例子:

choices([['YES', 'NO', 'YES', 'YES'], ['NO', 'NO', 'YES', 'NO'], ['YES', 'YES', 'YES', 'YES']]) 

列表中的每個列表有四個是/否選擇(下面列出的四個選項指數爲好,如綠色,紅色,藍色,黃色;但它不一定是四)。列表中的列表數量是多少人投票。

i = 0 
num = 0 
total_num = 0 
num_choices = len(INDICES) 
choices_index = 0 
choices_votes = [] 
choices_votes_num = [] 
index = 0 
total_choices = [] 
winning_choice = '' 
winning_index = 0 
while i < len(parameter): 
    while num < num_choices: 
     for item in parameter: 
      choices_votes.append(item[num]) 
     num += 1 
    i += 1 
while total_num < len(choices_votes): 
    if choices_votes[total_num] == 'YES': 
     choices_votes_num.append(1) 
     total_num += 1 
    elif choices_votes[total_num] == 'NO': 
     choices_votes_num.append(0) 
     total_num += 1 
while choices_index < len(choices_votes_num): 
    count = int(len(choices_votes_num)/num_choices) 
    total = 0 
    total = sum(choices_votes_num[choices_index:(choices_index + count)]) 
    total_choices.append(total) 
    choices_index = choices_index + count 
for score in total_choices: 
    winning_index = max(total_choices) 
    winning_choice = INDEX_TO_NAME[total_choices.index(winning_index)] 
return winning_choice, total_choices 

INDEX_TO_NAMEINDEX_TO_NAME只是一個字典,它將索引連接到選項(顏色)。

基本上,代碼應該將每個yes計爲1分,每個no計爲零分,將每個可用選項的總積分加起來,然後返回總計和獲勝者。

回答

4

讓我們開始:

c = [['YES', 'NO', 'YES', 'YES'], 
    ['NO', 'NO', 'YES', 'NO'], 
    ['YES', 'YES', 'YES', 'YES']] 

INDICES = ['red', 'green', 'blue', 'yellow'] 

既然你使用INDICES反正你的來源調查,我們可以假設,答案總是排隊與INDICES數量。

我們可以利用zip重組這樣的數據:

zip(*c) 
#[('YES', 'NO', 'YES'), 
# ('NO', 'NO', 'YES'), 
# ('YES', 'YES', 'YES'), 
# ('YES', 'NO', 'YES')] 

這擴大了答案,爭論和重組他們的實際指標進行分組。因此,第一個指標是「紅」,二是「綠色」等

現在我們可以再次壓縮,將其與指數相結合:

results = zip(INDICES, zip(*c)) 
#[('red', ('YES', 'NO', 'YES')), 
# ('green', ('NO', 'NO', 'YES')), 
# ('blue', ('YES', 'YES', 'YES')), 
# ('yellow', ('YES', 'NO', 'YES'))] 

,我們可以遍歷results,簡單地計算的出現'是':

totals = [(ind, answers.count('YES')) for ind,answers in results] 
#[('red', 2), ('green', 1), ('blue', 3), ('yellow', 2)] 

所以這裏我們有總數。我們可以把它傳遞到調用max把它告訴我們哪一個是贏家:

max(totals, key=lambda x: x[1]) 
#('blue', 3) 

max默認情況下將首先尋找的指數,所以我們可以把它key功能指示它拉而是索引1。它表明我們藍色是贏家。

更有效率,我們實際上可以發電機傳遞到max

totals = ((ind, answers.count('YES')) for ind,answers in results) 
#<generator object <genexpr> at 0x102581fa0> 
max(totals, key=lambda x: x[1]) 
#('blue', 3) 

最後一個語句可以這樣寫:

max(((ind, answers.count('YES')) for (ind,answers) in zip(INDICES, zip(*c))), 
    key=lambda x: x[1]) 

我知道這個答案引入了一些列表理解和lambda(以及generator),但是您需要一種清理方法,這是您可以使用的工具的一個示例。希望這會給你你需要的幫助!

注意:此答案不考慮平局。但我確信你可以從這裏工作,將這些例子整合到你的實際代碼中

+0

謝謝!這有幫助! – user52610