web-dev-qa-db-ja.com

Pythonのソート済みリストにアイテムを挿入します

メソッドの1つがソートされたリストに新しいアイテムを挿入するクラスを作成しています。アイテムは、ソートされたリストの修正された(ソートされた)位置に挿入されます。ただし、[][:]+、およびlen以外の組み込みリスト関数またはメソッドを使用することはできません。これは本当に私を混乱させる部分です。

これを行う最善の方法は何でしょうか?

51
Will S

bisect モジュールの insort 関数を使用します。

>> import bisect 
>> a = [1, 2, 4, 5] 
>> bisect.insort(a, 3) 
>> print(a) 
[1, 2, 3, 4, 5] 
79
stanga

ヒント1: bisectモジュール のPython)コードを調べてください。

ヒント2: Sliceing はリストの挿入に使用できます:

>>> s = ['a', 'b', 'd', 'e']
>>> s[2:2] = ['c']
>>> s
['a', 'b', 'c', 'd', 'e']
73

Bisectモジュールを使用する必要があります。また、bisect.insort_leftを使用する前にリストをソートする必要があります

それはかなり大きな違いです。

>>> l = [0, 2, 4, 5, 9]
>>> bisect.insort_left(l,8)
>>> l
[0, 2, 4, 5, 8, 9]

timeit.timeit("l.append(8); l = sorted(l)",setup="l = [4,2,0,9,5]; import bisect; l = sorted(l)",number=10000)
    1.2235019207000732

timeit.timeit("bisect.insort_left(l,8)",setup="l = [4,2,0,9,5]; import bisect; l=sorted(l)",number=10000)
    0.041441917419433594
33
Ricky

これはあなたのための可能な解決策です:

a = [15, 12, 10]
b = sorted(a)
print b # --> b = [10, 12, 15]
c = 13
for i in range(len(b)):
    if b[i] > c:
        break
d = b[:i] + [c] + b[i:]
print d # --> d = [10, 12, 13, 15]
1
ngoc thoag

私は今アルゴリズムを学んでいるので、bisectモジュールはどのように書くのだろうか。以下は、二分法を使用したソート済みリストへのアイテムの挿入に関するbisectモジュールのコードです。

def insort_right(a, x, lo=0, hi=None):
    """Insert item x in list a, and keep it sorted assuming a is sorted.
    If x is already in a, insert it to the right of the rightmost x.
    Optional args lo (default 0) and hi (default len(a)) bound the
    slice of a to be searched.
    """

    if lo < 0:
        raise ValueError('lo must be non-negative')
    if hi is None:
        hi = len(a)
    while lo < hi:
        mid = (lo+hi)//2
        if x < a[mid]:
            hi = mid
        else:
            lo = mid+1
    a.insert(lo, x)
0