Python 更改“投票”和“批准”的输出`
我正在尝试编写一个函数,该函数接受一个参数,该参数是一个由4个元素组成的列表,表示单次骑行的批准票;内部列表元素的顺序对应于称为Python 更改“投票”和“批准”的输出`,python,list,Python,List,我正在尝试编写一个函数,该函数接受一个参数,该参数是一个由4个元素组成的列表,表示单次骑行的批准票;内部列表元素的顺序对应于称为参与方索引的参与方列表中参与方的顺序 得票最多的政党获胜 它应该返回一个2元组,其中第一个元素是获胜方的名称,第二个元素是一个四元素列表,其中包含每个政党的赞成票数。列表元素的顺序与参与方索引中参与方的顺序相对应 我的代码是: def voting_approval(approval): parties = ['NDP','GREEN','LIBERAL','C
参与方索引的参与方列表中参与方的顺序
得票最多的政党获胜
它应该返回一个2元组,其中第一个元素是获胜方的名称,第二个元素是一个四元素列表,其中包含每个政党的赞成票数。列表元素的顺序与参与方索引中参与方的顺序相对应
我的代码是:
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])
尚未进行广泛测试,但您可以尝试:
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])
这会在开始时将您的列表拉到一起,对是的
进行汇总,并创建一个包含总计的新列表,然后用于提取所需信息。如果这不是您想要的,很乐意调整。您已经在值中存储了每个参与方的“是”数量。只需按以下方式更改代码
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)
您不需要total
var.value
已经是您想要的了
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)
我格式化了它,这样你就可以看到你的代码几乎得到了答案
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]
基本上,如果您认为每个投票列表都是审批
列表中的一行,您要做的是统计或合计列中显示的赞成票数。一个很好的方法是将这个列表的行和列进行换位(或交换行和列),然后将每个结果行中的行数相加
下面的代码显示了如何轻松地完成此操作。请注意,返回的元组中的第一项是参与方名称的列表
,而不是单个值,因为可以使用关系,如所示的测试值所示。我也会考虑将<代码>批准< /代码>改为<代码>批准> <代码>,以更好地反映它的内容。
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)
输出:
是否希望结果为('LIBERAL',[1,0,2,0])
?我想你有一个打字错误。你能详细说明一下你的代码应该做什么吗?approval
是什么样子的?一个“approval”的例子是[['Yes','No','Yes','No'],['No','No','Yes','No']。这只是一个包含4个元素的随机列表,可以是,也可以是。如果我能提出建议,最好使用True
和False
关键字,而不是分别使用'yes'
和'No'
。@user1864828很高兴听到它:)祝你万事如意!嘿,我能再问你一个问题吗?我要发另一个问题。我喜欢你的编码风格。如果你也能帮我做这个,那就太棒了:D@user1864828哈,谢谢:)很高兴看一看,但我肯定是这里的底层——你会从大男孩那里得到很棒的解决方案。@RocketDonkey“底层”?哼-你不公平;)
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])