a = 132
b = [0, 10, 30, 60, 100, 150, 210, 280, 340, 480, 530]
a
は、注文リストb
の6番目の位置にあるはずです。新しいアイテムをソートされたリストに挿入して並べ替えることができるインデックスを見つける方法は?
どうすればいいですか?
a = 132
b = [0, 10, 30, 60, 100, 150, 210, 280, 340, 480, 530]
a
は、注文リストb
の6番目の位置にあるはずです。新しいアイテムをソートされたリストに挿入して並べ替えることができるインデックスを見つける方法は?
どうすればいいですか?
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]
になります。
さらにエッジケースが懸念されます。たとえば、あなたが(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()
。
'a'は実際には' b'の6番目の位置にあり、4番目の位置にはありません。 @madjarが指摘したように、 'bisect'モジュールを使いました。 (bisect_ [left | right] ')、' bisect.insort(b、a) 'や' insort [left | right] 'を挿入するために' bisect.bisect(b、a) ' –
関連するhttp://stackoverflow.com/questions/1109804/does-python-have-a-sorted-list –