-2

我正在尝试编写一个函数,该函数接受一个参数,该参数是 4 元素列表的列表,代表单次骑行的批准选票;内部列表元素的顺序对应于称为 的当事方列表中当事方的顺序PARTY_INDICES

“赞成”票数最多的一方获胜。

它应该返回一个 2 元组,其中第一个元素是获胜方的名称,第二个元素是一个四元素列表,其中包含每一方的赞成票数。列表元素的顺序对应于 中各方的顺序PARTY_INDICES

这是我到目前为止所拥有的:

def voting_approval(approval):
    ''' (list of list of str) -> tuple of (str, list of int)
        In Approval Voting, the party that receives the most YES votes wins the seat.
    '''

    parties=['NDP','GREEN','LIBERAL','CPC']
    totals = [sum('YES') for x in zip(*approval)]
    win_party = parties[totals.index(max(totals))]
    return (win_party, totals)

但是,当我尝试voting_approval(['YES','NO','YES','NO'],['YES','NO','YES','YES'],['YES','YES','YES','YES']).

我收到以下错误:

builtins.TypeError: voting_approval() takes exactly 1 positional argument (3 given)
4

2 回答 2

0

在不尝试对函数进行故障排除的情况下,错误的原因是当它只接受一个参数时,您将 3 个列表作为参数传递给函数。

您可以使用该功能的另一种方法是:

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

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

然后像这样使用它:

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

这将返回 ('LIBERAL', 2)

于 2012-11-30T01:42:18.217 回答
0

我将解决您的主要问题,计算“是”票的数量。

party_list = ['foo','bar','zoo']
yes_votes = {}
sample_votes = [['no','yes','no'],['yes','yes','no'],['no','no','no']]

for inner_list in sample_votes:
   for party_index, vote in enumerate(inner_list):
      if vote.lower() == 'yes':
          if party_list[party_index] not in yes_votes:
              yes_votes[party_list[party_index]] = 1
          else:
              yes_votes[party_list[party_index]] += 1

print 'Winner is ',max(yes_votes, key=lambda x: yes_votes[x])
于 2012-11-30T02:14:25.540 回答