2016-03-29 19 views
4
myArr = array([4,1,88,44,3]) 
myNumber = 25 
FindClosest(myArr, myNumber) 
... 
4, 44 

リスト内の最も近い2つの数字を特定の数字にして、そのうちの1つが高く、もう1つが低くなるような方法はありますか?特定の数字の上下に最も近い要素を見つける

は私がすることによって、最も近い数を見つけることができます。また

min(myArr.tolist(), key=lambda x:abs(x-myNumber)) 
+0

subtract、sort、pop! –

+2

なぜあなたは '44'と' 88'を得るのですか?どちらも目標より高い。おそらくあなたは '4'と' 44'を望んでいますか? – ShadowRanger

+0

@ShadowRanger、ありがとうございましたq – user308827

答えて

10

ソートは必要ありません44, 4であり、(今回の複雑さOを作りますn logn)をO(n)にする必要があります。

私はnumpyの配列インデックスを利用して、これはあなたが探しているものであると信じて:

>>> # the smallest element of myArr greater than myNumber 
>>> myArr[myArr > myNumber].min() 
44 

>>> # the largest element of myArr less than myNumber 
>>> myArr[myArr < myNumber].max() 
4 
+0

あなたが申請したロジックの明快さを賞賛する必要があります –

2
first = min([for i in myArr if a>i]) 
second = max([for i in myArr if a<i]) 

を、正解はない44, 88

+1

これは、1つを大きくすることと1つ小さくすることを保証するものではありません。 – wim

+0

うん、そうだね。 – levi

+0

@wim私はすでに修正済みです。 – levi

0
upper = min([ i for i in myArr.tolist() if i >= myNumber], key=lambda x:abs(x-myNumber)) 
lower = min([ i for i in myArr.tolist() if i < myNumber], key=lambda x:abs(x-myNumber)) 
1

私は、入力値に2つの一番近い数字を見つけるための答えを持っている、以下のプログラムを参照してください。 -

from collections import OrderedDict 


def find_closer(): 
    a = [9, 19, 87, 43, 10] 
    b = int(input("Enter number :")) 
    # diff_list = [] 
    diff_dict = OrderedDict() 
    if b in a: 
     b = input("Number already exists, please enter another number ") 
    else: 
     for x in a: 
      diff = x - b 
      if diff < 0: 
       # diff_list.append(diff*(-1)) 
       diff_dict[x] = diff*(-1) 
      else: 
       # diff_list.append(diff) 
       diff_dict[x] = diff 
    print("diff_dict", diff_dict) 
    # print(diff_dict[9]) 
    sort_dict_keys = sorted(diff_dict.keys()) 
    print(sort_dict_keys) 
    closer_less = 0 
    closer_more = 0 
    for closer in sort_dict_keys: 
     if closer < b: 
      closer_less = closer 
     else: 
      closer_more = closer 
      break 
    print("closer less =", closer_less, "and closer more =", closer_more) 


find_closer() 

これは純粋なpythonプログラムです。それが役に立てば幸い !!

関連する問題