私自身のプロジェクトでは、10進数のソリューションに似たソリューションを試す予定ですが、代わりにバイト配列を使用します。
def pad(x, x_len, length):
if x_len >= length:
return x
else:
for _ in range(length - x_len):
x += b"\x00"
return x
def order_index(_from, _to, count, length=None):
assert _from != _to
assert _from < _to
if not length:
from_len = len(_from)
to_len = len(_to)
length = max(from_len, to_len)
_from = pad(_from, from_len, length)
_to = pad(_to, to_len, length)
from_int = int.from_bytes(_from, "big")
to_int = int.from_bytes(_to, "big")
inc = (to_int - from_int)//(count + 1)
if not inc:
length += 1
_from += b"\x00"
_to += b"\x00"
return order_index(_from, _to, count, length)
return (int.to_bytes(from_int + ((x+1)*inc), length, "big") for x in range(count))
>>> index = order_index(b"A", b"Z", 24)
>>> [x for x in index]
[b'B', b'C', b'D', b'E', b'F', b'G', b'H', b'I', b'J', b'K', b'L', b'M', b'N', b'O', b'P', b'Q', b'R', b'S', b'T', b'U', b'V', b'W', b'X', b'Y']
>>>
>>> index = order_index(b"A", b"Z", 25)
>>> [x for x in index]
[b'A\xf6', b'B\xec', b'C\xe2', b'D\xd8', b'E\xce', b'F\xc4', b'G\xba', b'H\xb0', b'I\xa6', b'J\x9c', b'K\x92', b'L\x88', b'M~', b'Nt', b'Oj', b'P`', b'QV', b'RL', b'SB', b'T8', b'U.', b'V$', b'W\x1a', b'X\x10', b'Y\x06']
アイデアは、b"\x00"
より多くの値が必要な場合に関係するレコードに単に追加するため、可能な中間の値を使い果たすことはできないということです。(int
Python 3では無制限です。そうでない場合、比較するために最後にバイトのスライスを選択する必要があります。2つの隣接する値の間で、差は最後に向かって詰められるという仮定です。)
たとえば、2つのレコードがb"\x00"
ありb"\x01"
、との間でレコードをやりたいとします。0x00
との間に利用可能な値はない0x01
ためb"\x00"
、両方に追加し、新しい値を挿入するために使用できる一連の値を取得します。
>>> records = [b"\x00", b"\x01", b"\x02"]
>>> values = [x for x in order_index(records[0], records[1], 3)]
>>> records = records + values
>>> records.sort()
>>> records
[b'\x00', b'\x00@', b'\x00\x80', b'\x00\xc0', b'\x01', b'\x02']
すべてが辞書式順序になるため、データベースは簡単にソートできます。レコードを削除しても、それは順番どおりです。私のプロジェクトでは、私が作ったb"\x00"
とb"\xff"
などFIRST
とLAST
記録、しかし、と「を」付加する値/ APPEND新しいレコード「から」仮想としてそれらを使用するために:
>>> records = []
>>> value = next(order_index(FIRST, LAST, 1))
>>> value
b'\x7f'
>>> records.append(value)
>>> value = next(order_index(records[0], LAST, 1))
>>> value
b'\xbf'
>>> records.append(value)
>>> records.sort()
>>> records
[b'\x7f', b'\xbf']
>>> value = next(order_index(FIRST, records[0], 1))
>>> value
b'?'
>>> records.append(value)
>>> records.sort()
>>> records
[b'?', b'\x7f', b'\xbf']