如何将值赋给字典

时间:2017-10-12 21:17:44

标签: python-3.x dictionary key-value-store

我正在创建一个函数,该函数应该返回包含来自不同列表的键和值的字典。但是我在将列表的平均值作为字典的值时遇到了问题。但是,我认为我正确地获得了密钥。 这是我到目前为止所得到的:

 def exp (magnitudes,measures):
   """return for each magnitude the associated mean of numbers from a list"""
dict_expe = {}
for mag in magnitudes:
    dict_expe[mag] = 0
    for mea in measures:
        summ = 0
    for n in mea:
        summ += n
        dict_expe[mag] = summ/len(mea)


        return dict_expe

print(exp(['mag1', 'mag2', 'mag3'], [[1,2,3],[3,4],[5]]))

输出应为:

{mag1 : 2, mag2: 3.5, mag3: 5}

但我得到的总是5作为所有键的值。我想到了zip()方法,但我试图避免它,因为它在两个列表中都需要相同的长度。

1 个答案:

答案 0 :(得分:0)

序列的平均值为sum(sequence) / len(sequence),因此您需要遍历magnitudesmeasures,计算这些均值(算术平均值)并将其存储在字典中。

你可以通过更多的pythonic方式实现这一目标。所有这些示例都会产生{'mag1': 2.0, 'mag2': 3.5, 'mag3': 5.0}

使用for i in range()循环:

def exp(magnitudes, measures):
    means = {}
    for i in range(len(magnitudes)):
        means[magnitudes[i]] = sum(measures[i]) / len(measures[i])
    return means

print(exp(['mag1', 'mag2', 'mag3'], [[1, 2, 3], [3, 4], [5]]))

但是如果你需要列表的索引和值,你可以使用for i, val in enumerate(sequence)方法,在这种情况下更合适:

def exp(magnitudes, measures):
    means = {}
    for i, mag in enumerate(magnitudes):
        means[mag] = sum(measures[i]) / len(measures[i])
    return means

print(exp(['mag1', 'mag2', 'mag3'], [[1, 2, 3], [3, 4], [5]]))

另一个问题隐藏在此处:i索引属于magnitudes,但我们也从measures使用它获取值,如果您有{{magnitudes,这不是什么大问题1}}和measures长度相同,但如果magnitudes更大,您将得到IndexError。所以在我看来,使用zip函数是最好的选择(实际上,对于python3.6,它不需要两个列表长度相同,它只会使用长度最短的一个作为结果的长度):

def exp(magnitudes, measures):
    means = {}
    for mag, mes in zip(magnitudes, measures):
        means[mag] = sum(mes) / len(mes)
    return means

print(exp(['mag1', 'mag2', 'mag3'], [[1, 2, 3], [3, 4], [5]]))

请随意使用符合您要求的示例,并且不要忘记添加文档字符串。

你很可能不需要这样的pythonic 方式,但当字典理解发挥作用时,它可能更短:

def exp(magnitudes, measures):
    return {mag: sum(mes) / len(mes) for mag, mes in zip(magnitudes, measures)}

print(exp(['mag1', 'mag2', 'mag3'], [[1, 2, 3], [3, 4], [5]]))