2012-07-02 2 views
22
a = 132 

b = [0, 10, 30, 60, 100, 150, 210, 280, 340, 480, 530] 

aは、注文リストbの6番目の位置にあるはずです。新しいアイテムをソートされたリストに挿入して並べ替えることができるインデックスを見つける方法は?

どうすればいいですか?

+3

'a'は実際には' b'の6番目の位置にあり、4番目の位置にはありません。 @madjarが指摘したように、 'bisect'モジュールを使いました。 (bisect_ [left | right] ')、' bisect.insort(b、a) 'や' insort [left | right] 'を挿入するために' bisect.bisect(b、a) ' –

+0

関連するhttp://stackoverflow.com/questions/1109804/does-python-have-a-sorted-list –

答えて

23

bisectを使用してください。これは、最も美しいAPIではありませんが、あなたが必要とするものです。

bisect.bisectを使用して、必要なものを正確に返します。

+0

なぜ「最も美しいAPIではないのですか」感謝! – Tanmay

25

bisectは、このタスクに最適なPython標準ライブラリのモジュールです。モジュールbisectの関数bisectは、値の挿入ポイントのインデックスを提供します。

私はbisect

from bisect import bisect 
a = 132 
b = [0, 10, 30, 60, 100, 150, 210, 280, 340, 480, 530] 
print(bisect(b, a)) 

のためのコード例を挙げましょうリストは0ベースであるため、結果は5になりますので、実際には6位です。

あなたが知ることができることは、insertの結果を使用することです。今

index = bisect(b, a) 
b.insert(index, a) 

または中間変数なし

b.insert(bisect(b, a), a) 

b[0, 10, 30, 60, 100, 132, 150, 210, 280, 340, 480, 530]になります。

+1

ありがとう!しかし、@ madjarが最初に答えたので、あなたのためにupvote! – est

+0

それは問題ありません。私はmadjarをupvoted。 :-) – Matthias

1

さらにエッジケースが懸念されます。たとえば、あなたが(a, c)の範囲内で、前述のb内の要素を選択すると、あなたが

b[idx_a:idx_c] 

を使用してそれらを選ぶとし、その後、あなたはa, cが実際にbの要素である場合を考える必要があります。

bisect.bisect(b, 10) 
bisect.bisect(b, 11) 

は、両方の私たちの例では、すなわち、まさにこの行う関数bisect.bisect_leftがあり、我々は幸いにも1でインデックスを下げる必要があるa=10場合はこのようにインデックス2を与えることに注意してください

bisect.bisect_left(b, 10) 

1.

全体与え、左のインデックスはbisect.bisect_left()を使用して計算されなければならない(bisect.bisect()と同じである)右インデックスbisect.bisect_right()

関連する問題