2017-06-05 496 views
-2

我試圖搜索列表以找到最接近50%的值。我跟蹤該值的索引,使用它來查找另一個列表中的中值。我的代碼無法正常工作:遍歷數列表

def find_median(percent_list, avg_lst): 
 
    closeValueIndex = [] 
 
    count = 0 
 
    med_num = 50 
 
    for i in percent_list: 
 
     diff = abs(percent_list - med_num) 
 
     minDiffValue = min(diff) 
 
     if i == minDiffValue: 
 
      closeValueIndex.append(count) 
 
     count+= 1 
 
    med = avg_lst[count] 
 
    return med 
 

+0

您正在測試的輸入是什麼,您獲得的輸出是什麼以及預期的輸出是什麼? – karthikr

+0

歡迎來到StackOverflow。請閱讀並遵守幫助文檔中的發佈準則。 [最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)適用於此處。在發佈您的MCVE代碼並準確描述問題之前,我們無法爲您提供有效的幫助。 我們應該能夠將發佈的代碼粘貼到文本文件中,並重現您描述的問題。 – Prune

回答

0

您應該使用enumerate。它用於同時跟蹤列表的索引和元素。

您還可以使用key功能min同時獲得所有這些!

def find_median(percent_list, avg_list): 
    count, _ = min(enumerate(percent_list), key=lambda ie: abs(ie[1]-50)) 
    return avg_list[count] 

這固然混淆代碼使用lambda(這只是一個匿名函數)以從(index, value)對你送入它拉出值,並選擇最小的元素。你可以輕鬆地寫:

def find_median(percent_list, avg_list): 
    min_idx = 0 
    min_diff = abs(percent_list[0] - 50) 
    for i, val in enumerate(percent_list): 
     diff = abs(val - 50) 
     if diff < min_diff: 
      min_idx, min_diff = i, diff 
    return avg_list[min_idx] 

或者只是簡單地命名你的匿名函數。

def diff_from_50(tup): 
    _, v = tup # ignore the first element 
    return abs(50 - v) 

i, _ = min(enumerate(percent_list), key=diff_from_50) 
result = avg_list[i] 
1

你混淆了一些自己的概念,而你濫用min。讓我們看看代碼:

for i in percent_list: 
    diff = abs(percent_list - med_num) 

到目前爲止你做得還行; i成爲percent_list的每個成員,一次一個。對於每一個這種的,diff是從50的絕對差值然而,下一行是一個邏輯錯誤:

minDiffValue = min(diff) 

這將不會做任何有用的:diff僅僅是一個單一的值,所以這個必須返回該值。

if i = minDiffValue: 

這是另一個邏輯錯誤,但在albegra。 i是列表元素; minDiffValue是它距離50的距離。這將是True的唯一方法是值25.這對你的程序沒有任何意義。

相反,您需要記住位置的最小元素。嘗試合併迭代

for i, value in enumerate(percent_list): 
    diff = abs(percent_list - med_num) 
    if diff < minDiffValue: 
     # Remember the minimum difference and its position 
     minDiffValue = diff 
     minIndex = i 

這樣,一旦你完成了循環,你有最小差異其準備使用位置。

return avg_lst[minIndex] 

有更多的「Python化」的方式來做到這一點,但我覺得這個可能是最適合你當前的編程水平。

+0

嗨。謝謝。但是現在怎麼會告訴我,minDiffValue是未定義的 –

+0

這不是一個打包好的作業解決方案;我希望你知道如何以及何時初始化一個值。例如,在進入循環之前將其設置爲9999。 – Prune