2012-11-25 44 views
1

在下面的代碼中,爲什麼我的代碼不能正確迭代?我可能錯過了一行,但我不明白爲什麼它不起作用。重申列表和字典

我有下面的測試案例的功能:

>>> borda([['A', 'B', 'C', 'D'], ['B', 'A', 'C', 'D'], ['B', 'C', 'D', 'A']]) 
('B', [5, 8, 4, 1]) 

凡在參數列表的排名,每個#1個等級的得3分,#2得到2分,#3變1分,沒有其他的隊伍能夠得到任可能不一定有四個選擇。元組中的第一個元素應該是具有最高點數的選擇,第二個元素是每個選擇得到的點的數量,按字母順序排列。

我沒有完成這個功能,但我試圖得到一個選擇的字典作爲按字母順序排列的鍵和作爲值的排名計數,但輸出結果只是字典參數中最後一個列表的最後一個元素。

L = ['A', 'B', 'C', 'D'] #This is referenced outside the function since it might change 
D = {} 
i = 0 
num = 0 
while num < len(L): 
    num += 1 
    for choice in L: 
     while i < len(parameter): 
      for item in parameter: 
       if item[0] == choice: 
        D[choice] = D.get(choice, 0) + 3 
       if item[1] == choice: 
        D[choice] = D.get(choice, 0) + 2 
       if item[2] == choice: 
        D[choice] = D.get(choice, 0) + 1 
       i += 1 
return D 
+1

您可以提供您輸入的輸入樣本輸出嗎?我真的不明白你想讓你的功能做什麼。你想獲得一本字典,或者你想獲得一個元組嗎? – BrenBarn

+0

你有4個嵌套循環。那感覺不對,是嗎? @ jdotjot的解決方案對我來說很好,它只使用一個循環。 – jimhark

+0

@jimhark謝謝。公平地說,我也有一個列表理解。 – jdotjdot

回答

2

我會做到這一點的方法是這樣的:

import operator 
from collections import defaultdict 
listoflists = [['A', 'B', 'C', 'D'], ['B', 'A', 'C', 'D'], ['B', 'C', 'D', 'A']] 

def borda(listoflists): 
    outdict = defaultdict(int) 
    for item in listoflists: 
     outdict[item[0]] += 3 
     outdict[item[1]] += 2 
     outdict[item[2]] += 1 

    highestitem = max(outdict.iteritems(), key=operator.itemgetter(1))[0] 
    outlist = [outdict[item[0]] for item in sorted(outdict.keys())] 

    return (highestitem, outlist) 

更新:
我不知道爲什麼你不能import標準模塊會,但如果因爲任何原因,您被禁止使用import聲明,以下是僅包含內置功能的版本:

listoflists = [['A', 'B', 'C', 'D'], ['B', 'A', 'C', 'D'], ['B', 'C', 'D', 'A']] 

def borda(listoflists): 
    outdict = {} 
    for singlelist in listoflists: 
     # Below, we're just turning singlelist around in order to 
     # make use of index numbers from enumerate to add to the scores 
     for index, item in enumerate(singlelist[2::-1]): 
      if item not in outdict: 
       outdict[item] = index + 1 
      else: 
       outdict[item] += index + 1 

    highestitem = max(outdict.iteritems(), key=lambda i: i[1])[0] 
    outlist = [outdict[item[0]] for item in sorted(outdict.keys())] 

    return (highestitem, outlist) 
+0

感謝您的回答!我應該提到,雖然我不能導入任何東西,所以我必須堅持相當基本的循環。我知道我的解決方案超級麻煩,但我只是想要解決這個問題。 – user52610

+0

我擺脫了循環...檢查我的答案:) – sureshvv

+0

@ user1797510不知道爲什麼你不能導入任何東西,但我已經更新了我的答案,給出了一個沒有使用任何標準模塊的例子。 – jdotjdot

1

如果你有2.7:

import operator 
from collections import Counter 
listoflists = [['A', 'B', 'C', 'D'], ['B', 'A', 'C', 'D'], ['B', 'C', 'D', 'A']] 

def borda(listoflists): 
    outdict = sum([Counter({item[x]:3-x}) for item in listoflists for x in range(3]], 
        Counter()) 
    highestitem = max(outdict.iteritems(), key=operator.itemgetter(1))[0] 
    outlist = [outdict[item[0]] for item in sorted(outdict.iteritems(), 
                key=operator.itemgetter(0))] 
return (highestitem, outlist) 

媽媽快看..沒有循環:-)

退房http://ua.pycon.org/static/talks/kachayev/index.html明白爲什麼這是更好的。

+0

其實,你在這裏有三個循環。列表理解中的for循環仍然是一個循環。 – jdotjdot