0
CONSTANTS:

NDP_INDEX = 0
GREEN_INDEX = 1
LIBERAL_INDEX = 2
CPC_INDEX = 3

各当事者のデータが 4 要素のリストに表示されるインデックスの分布。

PARTY_INDICES = [NDP_INDEX, GREEN_INDEX, LIBERAL_INDEX, CPC_INDEX]

各キーがパーティー名で、各値がそのパーティーのインデックスである辞書。

NAME_TO_INDEX = {'NDP': NDP_INDEX,
'GREEN': GREEN_INDEX,'LIBERAL': LIBERAL_INDEX,'CPC': CPC_INDEX}

各キーが当事者のインデックスであり、各値がその当事者の名前である辞書。

INDEX_TO_NAME = {NDP_INDEX: 'NDP',GREEN_INDEX: 'GREEN', LIBERAL_INDEX:
'LIBERAL',CPC_INDEX: 'CPC'}


def voting_range(range_votes):
    ''' 
(list of list of int) -> tuple of (str, list of int)
#range_votes is a list of integers of range ballots for a single
#riding; the order of the inner list elements corresponds to the order
#of the parties in PARTY_INDICES.Based on range_votes, return a tuple
#where the first element is the name of the party winning the seat and
#the second is a list with the total range_votes for each party in the
#order specified in PARTY_INDICES.

>>> voting_range([[5, 4, 1, 4], [3, 2, 2, 5], [3, 3, 1, 4,]])
('CPC', [11, 9, 4, 13])

'''

NDP_count = 0
GREEN_count = 0
LIBERAL_count = 0

for sub_list in range_votes:
    NDP_count += sub_list[0]
    GREEN_count += sub_list[1]
    LIBERAL_count += sub_list[2]
    CPC_count += sub_list[3]

PARTY_INDICES[0] = NDP_count
PARTY_INDICES[1] = GREEN_count
PARTY_INDICES[2] = LIBERAL_count
PARTY_INDICES[3] = CPC_count

winner = max(NDP_count, GREEN_count, LIBERAL_count, CPC_count)
if winner == NDP_count:
    return 'NDP', PARTY_INDICES
elif winner == GREEN_count:
    return 'GREEN', PARTY_INDICES
elif winner == LIBERAL_count:
    return 'LIBERAL', PARTY_INDICES
elif winner == CPC_count:
    return 'CPC', PARTY_INDICES

新しい定数(ユニバーサル変数)を作成することはできず、ローカル変数のみを作成できるため、ヘルパー関数を使用してもこれを短縮する方法がわかりません

4

2 に答える 2

2

これを試して:

for sub_list in range_votes:
   for i in range(4):
       PARTY_INDICES[i] += sub_list[i]
return ( {PARTY_INDICES[0] : 'NDP', PARTY_INDICES[1] : 'GREEN', ...}[max(PARTY_INDICES)], 
         PARTY_INDICES )

それは私が喜んで作るのと同じくらい短いです;-)

于 2012-11-24T22:28:40.123 に答える
1

これらすべてのdictと範囲変数、および定義/列挙型のものは必要ありません。これは、Cが少し少なく、Pythonが少し多いです。

votes=[[5, 4, 1, 4], [3, 2, 2, 5], [3, 3, 1, 4,]]
parties=['NDP','GREEN','LIBERAL','CPC']

def voting_range(v):
  totals = [sum(x) for x in zip(*v)] # transpose row/col of list of lists
  pname = parties[totals.index(max(totals))]
  return (pname,totals)

>>> voting_range(votes)
('CPC',[11, 9, 4, 13])

ここで起こっているいくつかの魔法のPythonの事柄があります。*vリストのリストを解凍し、それらを個別の引数としてにフィードしますzip。これは、リスト内の各引数の最初の要素を返し、次にリスト内の各引数の2番目の要素を与える反復可能オブジェクトを返します。これには、マトリックスを転置する(行と列を入れ替える)効果があります。この形式では、各リストを単純に合計すると、投票の合計になります。for x in括弧で囲まれた構文はリスト内包表記です。これは、反復可能ファイルからリストを効率的に作成するもう1つの優れたPython機能です。最後にindexリストメソッドですこれは、指定された値を持つ最初の要素のインデックスを返します。この場合は最大です。vの要素はパーティの数と同じ長さである必要があるため、これはパーティリストへのインデックスとしても機能します。

于 2012-11-24T22:54:16.400 に答える