0

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

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

它应该返回一个 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一方名称,而不是单个值,因为可能有关联,如所示的测试值所示。我还会考虑更改approvalapprovals更好地反映其内容。

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

尚未进行广泛测试,但您可以尝试:

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's 相加并创建一个包含总计的新列表,然后用于提取所需的信息。如果这不是您想要的,很高兴进行调整。

于 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

你不需要那个total变量。values已经是你想要的了。

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 回答
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]and [1][1]

于 2012-11-30T03:34:10.717 回答