我有一个模块应该在给定矢量列表的情况下找到平均值。 问题是返回的值不一致。有时候它会给我预期的输出,有时却没有。
def find_average_record(sen_set, voting_dict):
"""
Input: a set of last names, a voting dictionary
Output: a vector containing the average components of the voting records
of the senators in the input set
"""
count = len(sen_set)
total_set = voting_dict[sen_set.pop()]
for senator in sen_set:
for vote in voting_dict[senator]:
total_set[vote] += vote
return [x/count for x in total_set]
示例:
voting_dict = {'Klein': [-1,0,1], 'Fox-Epstein': [-1,-1,-1], 'Ravella': [0,0,1]}
find_average_record({'Fox-Epstein','Ravella'}, voting_dict)
# should =>[-0.5, -0.5, 0.0]
答案 0 :(得分:1)
您使用每位参议员的投票数作为总投票数的索引。不要那样做。请改用enumerate()
。您还需要对voting_dict
分配的total_set
列表进行复制,以避免更改可变列表:
def find_average_record(sen_set, voting_dict):
count = len(sen_set)
total_set = voting_dict[sen_set.pop()][:]
for senator in sen_set:
for i, vote in enumerate(voting_dict[senator]):
total_set[i] += vote
return [x/count for x in total_set]
您还可以在每列上使用sum()
(使用zip()
转置行和列);这样可以避免完全改变任何投票清单:
def find_average_record(sen_set, voting_dict):
count = len(sen_set)
return [sum(col) / count for col in zip(*(voting_dict[sen] for sen in sen_set))]
现在任何一个版本都能正确返回平均值:
>>> find_average_record({'Fox-Epstein', 'Ravella'}, voting_dict)
[-0.5, -0.5, 0.0]
此外,voting_dict
中包含的列表不会更改。
答案 1 :(得分:0)
这可能是错的,因为你已经接受了Martijn的回答,但我认为这就是你想要的。我将参议员集参数更改为一个列表,以便返回的向量中的平均值与该列表的顺序相同(并且它们的数量相同)。
def find_average_record(sen_list, voting_dict):
"""
Input: a list of senator names, a voting dictionary
Output: a vector containing the average components of the voting records
of the senators in the input list in the same order
"""
def average(vector):
return sum(vector) / len(vector)
return [average(voting_dict[senator]) for senator in sen_list]
voting_dict = { 'Klein': [-1, 0, 1],
'Fox-Epstein': [-1,-1,-1],
'Ravella': [ 0, 0, 1]}
print(find_average_record(['Fox-Epstein', 'Ravella'], voting_dict))
输出:
[-1.0, 0.3333333333333333]