1

次のコードで、コードが正しく繰り返されないのはなぜですか?おそらく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ポイントを取得し、他のランクは何も取得しません。必ずしも4つの選択肢があるとは限りません。タプルの最初の要素はポイント数が最も多い選択肢であり、2番目の要素は各選択肢がアルファベット順に取得したポイント数です。

関数は完成していませんが、アルファベット順のキーとして選択肢の辞書を取得し、値としてランキングの数を取得しようとしていますが、出力は、の最後の要素のみの辞書です。パラメータの最後のリスト。

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
4

2 に答える 2

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)
于 2012-11-25T07:18:07.633 に答える
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)

ma..ループなしを見てください:-)

http://ua.pycon.org/static/talks/kachayev/index.htmlをチェックして、これが優れている理由を確認してください。

于 2012-11-25T09:33:34.467 に答える