내 자신의 프로젝트에서 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"
을 모두 사용할 수 없으며 더 많은 값이 필요한 경우 관련된 레코드에 a 만 추가하기 때문 입니다. ( int
파이썬 3에서는 제한이 없으며, 그렇지 않으면 비교하기 위해 끝에 바이트 조각을 선택해야합니다. 두 개의 인접한 값 사이에 차이가 끝을 향한다고 가정합니다.)
예를 들어, 두 개의 레코드가 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']