在我自己的项目中,我打算尝试一个类似于十进制数的解决方案,但改用字节数组:
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
在Python 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']
数据库可以轻松对它进行排序,因为所有内容都按字典顺序排列。如果您删除一条记录,它仍然是有序的。但是,在我的项目中,我制作了as b"\x00"
和b"\xff"
as FIRST
和LAST
records,以便将它们用作虚拟的“ from”和“ to”值来添加/添加新记录:
>>> 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']