我正在尝试编写一个函数,该函数接受一个参数,该参数是一个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])
答案 0 :(得分: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
求和,并创建一个包含总计的新列表,然后用于提取所需的信息。很高兴调整,如果这不是你想要的。
答案 1 :(得分: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)
答案 2 :(得分:0)
你不需要total
var。 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])
答案 3 :(得分: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]
。
答案 4 :(得分: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])