0

単一の乗馬の承認投票を表す 4 要素リストのリストであるパラメーターを取る関数を作成しようとしています。内側のリスト要素の順序は、 と呼ばれるパーティのリスト内のパーティの順序に対応しPARTY_INDICESます。

「賛成」票の多い党が勝利。

最初の要素が勝者の名前で、2 番目の要素が各党の賛成票の数を含む 4 つの要素のリストである 2 タプルを返す必要があります。リスト要素の順序は、 の関係者の順序に対応していPARTY_INDICESます。

私のコードは次のとおりです。

def voting_approval(approval):
    parties = ['NDP','GREEN','LIBERAL','CPC']
    values = [0,0,0,0]
    for decision in approval:
        for no, item in enumerate(decision):
            if item == 'Yes':
                values[no] += 1
                total = [(values) for x in zip(approval)]

    return (parties[values.index(max(values))], total)

私が試してみると:

voting_approval([['Yes', 'No', 'Yes', 'No'],['No', 'No', 'Yes', 'No']])

それは吐き出します:

('LIBERAL', [[1, 0, 2, 0], [1, 0, 2, 0]])

しかし、私は結果を次のようにしたい:

('LIBERAL', [1, 0, 2, 0])
4

5 に答える 5

0

基本的に、投票の各リストをリストの行と考える場合、approval実行したいのは、列に表示される賛成票の数を集計または合計することです。これを行う良い方法は、このリストのリストを転置(または行と列を入れ替え)してから、結果の各行の数を合計することです。

これがいかに簡単に行われるかを示すコードがあります。示されているテスト値で示されているように、タイが可能であるため、返されるタプルの最初の項目はlist単一の値ではなく、パーティ名であることに注意してください。また、内容をより適切に反映するように変更approvalすることも検討します。approvals

approval = [['Yes', 'No', 'Yes', 'No'],
            ['No', 'No', 'Yes', 'No'],
            ['Yes', 'No', 'No', 'No'],]

def voting_approval(approval):
    parties = ['NDP','GREEN','LIBERAL','CPC']
    tallies = [sum(int(v =='Yes') for v in col) for col in zip(*approval)]
    most_yes = max(tallies)
    return ([party for i,party in enumerate(parties) if tallies[i] == most_yes], tallies)

print voting_approval(approval)

出力:

(['NDP', 'LIBERAL'], [2, 0, 2, 0])
于 2012-11-30T17:37:01.647 に答える
0

あなたのコードがほとんど答えを得ているのを見ることができるように、私はそれをフォーマットしました.

def voting_approval(approval):
    parties = ['NDP','GREEN','LIBERAL','CPC']
    values = [0,0,0,0]
    for decision in approval:
        for no, item in enumerate(decision):
            if item == 'Yes':
                values[no] += 1
                total = [(values) for x in zip(approval)]

    return (parties[values.index(max(values))], total)

almostAnswer = voting_approval([['Yes', 'No', 'Yes', 'No'],['No', 'No', 'Yes', 'No']])
answer = [sum(a) for (a) in zip(almostAnswer[1][0], almostAnswer[1][1])]
print answer

ダウンがありまし[sum(a) for a in zip(array1,array2)]たが、承認に含まれる要素の間違った部分を指していました。したがって、 と が必要[1][0]です[1][1]

于 2012-11-30T03:34:10.717 に答える
0

広範囲にテストしていませんが、試すことができます:

In [7]: def voting_approval(approval):
   ...:     parties = ['NDP', 'GREEN', 'LIBERAL', 'CPC']
   ...:     values = [sum(1 if i == 'Yes' else 0 for i in group) for group in zip(*approval)]
   ...:
   ...:     return (parties[values.index(max(values))], values)
   ...:

In [8]: voting_approval([['Yes', 'No', 'Yes', 'No'],['No', 'No', 'Yes', 'No']])
Out[8]: ('LIBERAL', [1, 0, 2, 0])

これにより、最初にリストが圧縮され、Yesが合計され、合計を含む新しいリストが作成されます。これを使用して、必要な情報が抽出されます。これがあなたが探していたものではない場合は、喜んで微調整してください。

于 2012-11-30T03:26:39.580 に答える
0

値に保存されているパーティーごとに「はい」の量が既にあります。次のようにコードを変更するだけです。

def voting_approval(approval):
    parties = ['NDP','GREEN','LIBERAL','CPC']
    values = [0,0,0,0]
    for decision in approval:
        for no, item in enumerate(decision):
            if item == 'Yes':
                values[no] += 1

    return (parties[values.index(max(values))], values)
于 2012-11-30T03:27:07.710 に答える
0

その変数は必要ありませんtotalvaluesすでにあなたが望むものです。

def voting_approval(approval):
    parties = ['NDP','GREEN','LIBERAL','CPC']
    values = [0,0,0,0]
    for decision in approval:
        for no, item in enumerate(decision):
            if item == 'Yes':
                values[no] += 1

    return (parties[values.index(max(values))], values)

approvals = [
    ['Yes', 'No', 'Yes', 'No'],
    ['No', 'No', 'Yes', 'No'],
]

print voting_approval(approvals)

matt@wraith:~/Dropbox/Public/StackOverflow$ python 13638424.py 
('LIBERAL', [1, 0, 2, 0])
于 2012-11-30T03:32:50.360 に答える