gpt4 book ai didi

python - 在不重载 IN 的情况下定义字典成员资格比较?

转载 作者:行者123 更新时间:2023-11-28 21:47:21 25 4
gpt4 key购买 nike

所以我有一个值列表:

alist = list()

我想检查列表的成员是否在字典中:

ahash = dict() #imagine I have filled a dictionary with data. 

for member in alist:
if member in hash:
#DO STUFF

这很简单。

不过我想做的是重新定义 IN 来实现模糊比较。所以我想做的是将 FOOBARBAZZ 之类的东西与 * 匹配,使得 FOO* 匹配 FOOBARBAZZ。

我能想到的最直接的方法是将整个情况实现为对象中的方法,然后重载 IN 运算符。但是出于我自己的原因(完全迂腐),我想避免使用 OOP 方法。

如果不为每次比较循环遍历整个词典(这听起来不对!),我如何才能实现我对词典的自定义比较?

额外:除了 IN 之外,IN 运算符是否有不同的名称?命名使得运营商的信息难以在搜索引擎中进行搜索。我认为它可能与 __contains__ 相同,但我还没有发现 __contains__ 如何用于字典。

最佳答案

要覆盖 in,您可以子类化内置的 dict 类型并定义一个新的 __contains__ 方法(这是 in 幕后调用):

In [9]: class FuzzyDict(dict):
...: def __contains__(self, needle):
...: if '*' not in needle:
...: return super(FuzzyDict, self).__contains__(needle)
...: else:
...: for key in self.keys():
...: if str(key).startswith(needle[:-1]):
...: return True
...: return False
...:

这在大多数方面都像一个dict

In [12]: my_dict = FuzzyDict(zip('abcde', range(1, 6)))

In [13]: my_dict
Out[13]: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

In [14]: my_dict['apple'] = 6

直到你开始使用 in 测试:

In [15]: 'a' in my_dict
Out[15]: True

In [16]: 'a*' in my_dict
Out[16]: True

In [17]: 'ap*' in my_dict
Out[17]: True

In [18]: 'b*' in my_dict
Out[18]: True

In [19]: 'bi*' in my_dict
Out[19]: False

这是基于我在您的帖子中看到的内容。如果您需要支持的不仅仅是 foo*,那么显然 startswith 测试是不够的,您甚至可能不得不使用正则表达式。这也只会覆盖 in - 如果您想要像 my_dict['FOO*'] 这样的 key 访问,您还需要覆盖 __getitem__ 和 friend 。

根据您的要求,我看不到可以在 O(n) 内完成此操作的方法。字典访问时间为 O(1) 的唯一原因是哈希,没有整个 key 就无法获得哈希。

关于python - 在不重载 IN 的情况下定义字典成员资格比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36628440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com