有没有一种方法可以通过非完整键访问字典的值?

时间:2020-04-21 22:15:25

标签: python dictionary

我需要一个带有字符串类型键的字典,但是您不需要输入整个单词来访问对应的值,只需输入一些前几个字符即可,它们足以与其他任何键都不匹配(类似于在控制台中键入内容,然后按Tab键,控制台会猜对正确的命令,因为没有其他命令与之匹配)

例如在字典中:

dicc = { 'suma':fun_suma, 'resta':fun_resta, 'producto':fun_producto }

我需要dicc['pr']dicc['prod']dicc['produc'](甚至只是dicc['p'])返回fun_producto(在此示例中,因为输入的字符串不会匹配其他任何键)。

python中是否有任何结构可以做到这一点?如果没有,您建议采用哪种算法?我知道在任何Python词典的后面,都有一棵高效的键树,可以快速找到所需的键。我想利用这一点。

更新:

  1. 是的,我错了,Python字典使用哈希表,而不是树。我记忆犹新。

  2. 是的,dicc['p']是一个引人注目的示例,但我使用它只是为了表明在某些情况下它可以简化太多的字符输入。当然,只有当键是众所周知的并且是有限集(例如解析器)时,它才有用。

1 个答案:

答案 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__()中进行测试,而不是将键强制为字符串,并将非字符串键交给父级。