0

我有一个模块,它应该在给定向量列表的情况下找到平均值。问题是返回值不一致。有时它给了我预期的输出,有时它没有。

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]
4

2 回答 2

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不会更改。

于 2013-07-29T14:47:01.707 回答
0

这可能是错误的,因为您已经接受了 Martijn 的回答,但我认为这就是您想要的。我将 senator set 参数更改为一个列表,以便返回的向量中的平均值与该列表的顺序相同(并且它们的数量相同)。

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]
于 2013-07-29T15:41:00.963 回答