繁体   English   中英

有没有办法通过不完整的键访问字典的值?

[英]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 字典后面,都有一个高效的键树,可以快速找到所询问的键。 我想利用这一点。

更新:

  1. 是的,我错了,Python 字典使用 hash 表,而不是树。 我混合了我的记忆。

  2. 是的, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM