2017-10-12 293 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]]))