您可以使用有序的键/值存储,如wiredtiger、leveldb、bsddb。它们都支持使用自定义排序功能的有序键。 leveldb 是最容易使用的,但如果你使用 python 2.7,bsddb is included in the stdlib。如果您只需要字典排序,您可以使用原始 hashopen 函数打开一个持久排序字典:
from bsddb import hashopen
db = hashopen('dict.db')
db['020'] = 'twenty'
db['002'] = 'two'
db['value'] = 'value'
db['key'] = 'key'
print(db.keys())
这个输出
>>> ['002', '020', 'key', 'value']
下班后别忘了关闭数据库:
db.close()
请注意,hashopen 配置可能不适合您的需要。在这种情况下,我建议您使用具有简单 API 的 leveldb 或 Wiredtiger 以提高速度。
要在 bsddb 中按值排序,您必须使用 复合键模式 或 键组合。归结为创建一个字典键,以保持您查找的顺序。在这个例子中,我们首先将原始 dict 值(使小值首先出现)与原始 dict 键(使 bsddb 键是唯一的)打包:
import struct
from bsddb import hashopen
my_dict = {'a': 500, 'abc': 100, 'foobar': 1}
# insert
db = hashopen('dict.db')
for key, value in my_dict.iteritems():
composite_key = struct.pack('>Q', value) + key
db[composite_key] = '' # value is not useful in this case but required
db.close()
# read
db = hashopen('dict.db')
for key, _ in db.iteritems(): # iterate over database
size = struct.calcsize('>Q')
# unpack
value, key = key[:size], key[size:]
value = struct.unpack('>Q', value)[0]
print key, value
db.close()
这会输出以下内容:
foobar 1
abc 100
a 500