2016-11-14 9 views
0

リスト内の要素を囲む2つの要素を探したい。私はこのコードを提案する(それは動作する)が、私はかなり容易な方法でこれを行う方法があると確信している。リスト内の要素をpythonで検索する

a = [4,5,6,8,9,15,16,18,54,60] 
b = 24 

i = 0 
while i<len(a): 
    if b > a[i-1] and b < a[i+1]: 
     result = [a[i-1],a[i]] 
     i = i+1 
    else: 
     i = i+1 

それは私を返します。

>>> result 
[18, 54] 

あなたはPythonの機能を知っていますか?

+0

申し訳ありませんが、あなたの質問はありません。配列を見ると、配列がソートされていて、18が最初に小さいもの、54が最初に最も高いものであることがわかります。 –

+0

私はそれが私が望んだとは思わない... –

+0

これまでに私の返信を試みた? –

答えて

4

私はバイナリ検索を使用します。 bより大きい最初の要素、またはbより小さい最後の要素のいずれかを見つける必要があります。あるインデックスであるjでバイナリ検索でより大きい最初の要素のインデックスが見つかりました。それから、私たちの答えはb [j - 1]、b [j]などです。これはO(logN)時間で機能します。

import bisect 
def find(a, b): 
    n, j = len(a), bisect.bisect_left(a, b) 
    if a[j] > b: 
     return (None if j == 0 else a[j-1]), a[j] 
    else: 
     return a[j], (None if j >= n - 1 else a[j + 1]) 


if __name__ == '__main__': 
    a = [4,5,6,8,9,15,16,18,54,60] 
    b = 24 

    print find(a, 24) 
    print find(a, 3) 
    print find(a, 4) 
    print find(a, 7) 
    print find(a, 60) 

短いアプローチ:

import bisect 
def find(a, b): 
    n, j = len(a), bisect.bisect_left(a, b) 
    return ((None if j == 0 else a[j-1]), a[j]) if a[j] > b else (a[j], (None if j >= n - 1 else a[j + 1])) 

重要:配列はb、2つの連続した数字の間にあるインスタンスが1つしかないと仮定すると、ソート順に

+0

これはおそらく動作しますが、私が行ったことよりも短いものを探しています。とにかくありがとう! –

+0

私はurリクエストを更新しました。短くしました。 –

1

する必要があり、あなたがzipを使用することができますし、ペアの要素を確認してください:

a = [4, 5, 6, 8, 9, 15, 16, 18, 54, 60] 
b = 24 

for i, j in zip(a,a[1:]): 
    if i < b < j: 
     result = [i,j] 
     break 
0
lst = [1,4,3,2,5] 

def min_max(p): 
    lst = [] 
    lst.append(min(p)) 
    lst.append(max(p)) 
    return lst 
print min_max(lst) 
関連する問題