2017-10-12 207 views
-1

我正在创建一个函数,该函数应该返回带有来自不同列表的键和值的字典。但是我在获得列表中的数字作为字典的值时遇到了问题。但是,我认为我正确地获得了钥匙。 这是我得到迄今:如何将值分配到字典

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()方法,但我试图避免它,因为它需要在这两个列表中的相同长度。

回答

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和,这对您的情况不是什么大问题长度相同,但如果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]])) 

可以随意使用哪个适合你的要求,这一个你喜欢的,不要忘记添加文档字符串的例子。

更有可能的是,你不需要例如Python的方式,但是当字典解析进场也可以是更短:

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