【发布时间】:2020-01-16 19:32:05
【问题描述】:
假设我有一个字典,其中包含 0、1 和 '*' 字符串作为我的键值的通配符。
例如,我的字典的结构是这样的:
{'010*10000':'foo', '100*1*000':'bar'......}
每个字典值都有一个固定的字符串长度,但是,字符串中的通配符表示为“*”字符。因此,“010110000”或“010010000”的值都返回“foo”。
问题在于我的字典的长度。我正在使用的字典有超过 500,000 多个条目。因此,当我尝试遍历 dict 中的每个键以查找键是否存在时,O(n) 复杂度会花费很长时间。
理想情况下,我想找到一种方法来检查字典中是否存在诸如“010110000”之类的值,类似于没有通配符的常规 python 字典的 .get() 函数。
我已经尝试使用 fnmatch 迭代我的字典,如下面的Wildcard in dictionary key:
for k in my_dict.keys():
if fnmatch.fnmatch(string_of_1s_and_0s, k):
print(my_dict[k])
break
##Do some operation here if we have found the matching key pair...and then break.
但是,O(n) 复杂度太慢了。有没有办法实现 get() 但使用通配符?
【问题讨论】:
-
密钥的实际长度是多少?我猜比您示例中的 9 位数字要长,因为否则您将无法获得 500K+ 唯一条目。
-
字符串是“一、零和通配符”吗?具体来说,是否可以将第一个通配符之前的字符和最后一个通配符之后的字符连接起来,然后从“包含二进制数字的字符串”转换为固定大小的整数?如是;您可以快速找到开始和结束匹配的所有条目(使用从字符串到整数的转换、旋转计数和掩码)。
-
通配符只是一个字符吗?多少个通配符?您可以将值两次(或多次)放入字典中以覆盖每个排列,然后使用精确匹配(使用散列的普通字典查找)吗?
-
密钥长度为 90 长。是的,字符串是 1、0,仅此而已。通配符只是 1 个通配符。我考虑过把每一个排列。这是一个可能的步骤。只是想知道是否有更好的方法。感谢您的所有回复。
标签: python-3.x algorithm performance dictionary wildcard