2017-06-05 18 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] 

これは確かにコードを難読化あなたがそれに供給し、かつ最小限の要素を選択している(index, value)ペアから値を引き出すために(ちょうど匿名関数である)lambdaを使用しています。

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は、一度に1つずつ、percent_listの各メンバーになります。これらのそれぞれについて、diffはしかし、次の行が論理的な誤りである50からの絶対差です:

minDiffValue = min(diff) 

は、これは便利な何もしません。diffは、単一の値であるので、この必見その値を返します。

if i = minDiffValue: 

これはもう一つの論理的なエラーですが、アルベグラです。 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的」な方法がありますが、私はこの1つはおそらく最も適したプログラミングのあなたの現在のレベルにあると思います。

+0

こんにちは。ありがとうございました。しかし、どのように今minDiffValueが定義されていないことがわかります –

+0

これはあなたの宿題にパッケージされた解決策ではありません。私はあなたがいつ、どのように値を初期化するかを知っていることを期待しています。たとえば、ループを開始する前に9999に設定します。 – Prune

関連する問題