[英]Is there a way to access the values of a dictionary by non-complete keys?
我需要一个带有字符串类型键的字典,但您不需要输入整个单词来访问对应的值,只需输入一些前字符,其中的一些字符足以不匹配任何其他键(类似于打字在控制台中,然后按 Tab 和控制台猜测正确的命令,因为没有其他匹配它)
例如在字典中:
dicc = { 'suma':fun_suma, 'resta':fun_resta, 'producto':fun_producto }
我需要dicc['pr']
, dicc['prod'] , dicc['produc']
dicc['prod']
] ,甚至只是dicc['p']
,返回fun_producto
(在这个例子中,因为输入的字符串不匹配任何其他钥匙)。
python 中是否有任何结构可以做到这一点? 如果没有,您建议使用哪种算法来构建它? 我知道在任何 Python 字典后面,都有一个高效的键树,可以快速找到所询问的键。 我想利用这一点。
更新:
是的,我错了,Python 字典使用 hash 表,而不是树。 我混合了我的记忆。
是的, dicc['p']
是一个戏剧性的例子,但我用它只是为了表明在某些情况下它可以缩写如此多的字符输入。 当然,只有当键是众所周知的并且是有限集时它才会有用,比如解析器。
您可以创建一个简单的字典子类来覆盖__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__()
中测试并将非字符串键推迟到父级,而不是强制键是字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.