0
def voting_borda(rank_ballots):
    '''(list of list of str) -> tuple of (str, list of int)

パラメーターは、1 回の乗馬のランク投票を表す 4 要素リストのリストです。

ボルダカウントは、ランキングに応じてポイントを割り当てて決定されます。パーティーは、第 1 選択のランキングごとに 3 ポイント、第 2 選択のランキングごとに 2 ポイント、第 3 選択のランキングごとに 1 ポイントを獲得します。(4 位にランクされてもポイントは与えられません。) たとえば、上記のランク投票では、リベラル カウントに 3 ポイント、グリーン カウントに 2 ポイント、CPC カウントに 1 ポイントが貢献します。最も多くのポイントを獲得したパーティーが議席を獲得します。

最初の要素が Borda Count に従って勝ったパーティーの名前で、2 番目の要素が各パーティーの合計ポイント数を含む 4 要素のリストであるタプルを返します。リスト要素の順序は、PARTY_INDICES の当事者の順序に対応しています。

#>>> voting_borda([['GREEN','NDP', 'LIBERAL', 'CPC'], ['GREEN','CPC','LIBERAL','NDP'],
    ['LIBERAL','NDP', 'CPC', 'GREEN']])
#('GREEN',[4, 6, 5, 3])

list_of_party_order = []
for sublist in rank_ballots:
    for party in sublist[0]:
        if party == 'GREEN':
            GREEN_COUNT += 3
        elif party == 'NDP':
            NDP_COUNT += 3
        elif party == 'LIBERAL':
            LIBERAL_COUNT += 3
        elif party == 'CPC':
            CPC_COUNT += 3

    for party in sublist[1]:
        if party == 'GREEN':
            GREEN_COUNT += 2
        elif party == 'NDP':
            NDP_COUNT += 2
        elif party == 'LIBERAL':
            LIBERAL_COUNT += 2
        elif party == 'CPC':
            CPC_COUNT += 2

   for party in sublist[2]:
        if party == 'GREEN':
            GREEN_COUNT += 1
        elif party == 'NDP':
            NDP_COUNT += 1
        elif party == 'LIBERAL':
            LIBERAL_COUNT += 1
        elif party == 'CPC':
            CPC_COUNT += 1

リストの各インデックスにポイントを与える方法がわかりません。誰か助けてくれませんか?複雑になりすぎずに。ありがとうございました!

4

2 に答える 2

0

これは、あなたが求めていたものとまったく同じではありません。値のみのリストではなく、勝者の名前と、すべての関係者とその値の辞書の 2 つの値を持つタプル返します私の意見では、これはほとんどの場合に適しています。気に入らない場合は、リストに変換できます。

また、1 つのリストの代わりに複数のパラメーターも使用しますが、単に*from を削除するだけで変更できます。*args

ただし、小さなコードよりも速度を重視する場合、これは最善の方法ではないことに注意してください。それはうまくいきます。

また、関数内でパーティー名やパーティーの数を使用しないようにすることで、パーティーの追加、名前変更、または削除を可能にするという点で、コードよりも優れています。

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)
    return winner, results

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

結果は次のようになります。('GREEN', {'LIBERAL': 5, 'NDP': 4, 'GREEN': 6, 'CPC': 3})

于 2012-11-24T16:48:36.657 に答える
0

あなたの投票シミュレーションの課題をオンラインで見つけ、そこからいくつかの定数を追加して、問題を解決するためのコードを少し単純化しました (ただし、最初の定義ではそのように見えない場合があります)。

以下で.rank_ballots _ 同点ではなかったとしても、要素が返されるのはシングルトン リストです。これは、実際には複数ある場合とない場合で異なるようにするよりも扱いが簡単です。

PARTY_NAMES = ['NDP', 'GREEN', 'LIBERAL', 'CPC']
NAME_TO_INDEX = {party:PARTY_NAMES.index(party) for party in PARTY_NAMES}
INDEX_TO_NAME = {PARTY_NAMES.index(party):party for party in PARTY_NAMES}

def voting_borda(rank_ballots):
    results = [0 for _ in PARTY_NAMES]
    MAX_POINTS = len(PARTY_NAMES)-1
    for ballot in rank_ballots:
        for i,party in enumerate(ballot):
            results[NAME_TO_INDEX[party]] += MAX_POINTS-i

    highest_rank = max(results)
    winners = [INDEX_TO_NAME[i] for i,total in enumerate(results) if total == highest_rank]
    return winners, results

rank_ballots = [['GREEN','NDP', 'LIBERAL', 'CPC'],
                ['GREEN','CPC','LIBERAL','NDP'],
                ['LIBERAL', 'GREEN', 'NDP', 'CPC'],
                ['LIBERAL','NDP', 'CPC', 'GREEN'],]

print(voting_borda(rank_ballots))

出力:

(['GREEN', 'LIBERAL'], [5, 8, 8, 3])
于 2012-11-30T19:56:53.087 に答える