我需要一个带有字符串类型键的字典,但是您不需要输入整个单词来访问对应的值,只需输入一些前几个字符即可,它们足以与其他任何键都不匹配(类似于在控制台中键入内容,然后按Tab键,控制台会猜对正确的命令,因为没有其他命令与之匹配)
例如在字典中:
dicc = { 'suma':fun_suma, 'resta':fun_resta, 'producto':fun_producto }
我需要dicc['pr']
,dicc['prod']
,dicc['produc']
(甚至只是dicc['p']
)返回fun_producto
(在此示例中,因为输入的字符串不会匹配其他任何键)。
python中是否有任何结构可以做到这一点?如果没有,您建议采用哪种算法?我知道在任何Python词典的后面,都有一棵高效的键树,可以快速找到所需的键。我想利用这一点。
更新:
是的,我错了,Python字典使用哈希表,而不是树。我记忆犹新。
是的,dicc['p']
是一个引人注目的示例,但我使用它只是为了表明在某些情况下它可以简化太多的字符输入。当然,只有当键是众所周知的并且是有限集(例如解析器)时,它才有用。
答案 0 :(得分:1)
您可以创建一个简单的字典子类,该子类重写__getitem__()
并返回值。您可能要防止使用非字符串键,因为字典中的键可能会像数字一样,而前缀没有多大意义。
这可能是一个开始,它将返回与前缀匹配的第一个键:
from collections import UserDict
class PrefixDict(UserDict):
def __setitem__(self, name, value):
if not isinstance(name, str):
raise ValueError("Keys must be strings")
super().__setitem__(name, value)
def __getitem__(self, name):
try:
return next(self.data[k] for k in self.data.keys() if k.startswith(name))
except StopIteration as error:
raise KeyError(f"Prefix '{name}' not found") from None
dicc = PrefixDict({'suma':'fun_suma', 'resta':'fun_resta', 'producto':'fun_producto' })
dicc['pr']
#'fun_producto'
dicc["q"]
# raises KeyError
dicc[""]
# ??
您可以代替在__getitem__()
中进行测试,而不是将键强制为字符串,并将非字符串键交给父级。