如何检查字典中具有特定模式的值的存在?

时间:2019-10-12 17:25:17

标签: python dictionary

我想在字典中找到前N个字符与另一个字符串相同的值。

例如:

我想获取前4个字符均为“ abcd”的所有值并返回其键值

string = "abcd"

dict = {'k1' : 'abcd4545', 'k2' : 'abab1234', 'k3' : 'abcd789456'}

结果:应返回k1和k3

我认为可以通过循环字典中的所有值并获取前N个字符进行比较来完成。

但是我需要处理包含大量数据的字典,有什么更好的方法吗?

4 个答案:

答案 0 :(得分:2)

当然,没有其他解决方案,只能解析所有值并测试每个值,而无需更多有关数据的信息。

没有比循环遍历整个字典更好的解决方案(即减少了操作),因为您需要解析所有字典以确保能够检索全部字典。

答案 1 :(得分:2)

不,除了对值进行迭代并检查条件外,没有其他解决方案,可以通过列表理解来实现循环:

[k for k, v in dict.items() if v.startswith(string)]

答案 2 :(得分:0)

如果只想执行一次操作,那么除了遍历所有值外,别无选择。但是,如果您需要重复执行此操作,并且想要提高时间性能,我建议在这里进行一些预处理。例如,您可以生成此字典的反向映射,即类似的东西。

reverse_dict = {v:k for (k,v) in dict} 在这里,V可以是像{v1 : [k1,k5], v2 : [k3], v3....}

这样的K数组

现在,您可以根据上面的reverseMap的第一个字母创建存储桶。如果首字母仅是英文字母数字,则将只有(26 + 10)个存储桶。如果可以使用两个字母,则为36 * 36个存储桶。我说的是Trie数据结构。然后,您可以在桶内线性搜索。这可以为您提供几乎恒定的时间性能,同时还可以使用一些额外的内存。如果您有大量的数据无法使用现代RAM大小保存,则可能必须将这些存储桶分布在各种系统上并使用相同的技术。这样可以大大提高性能。在这种情况下,将线性搜索任务简单地分配到一组机器上也可以工作,在完成后,每台机器返回键[k1,k2 ... kn]的结果,然后最终将结果汇总。

答案 3 :(得分:-1)

string = "abcd"
dic = {'k1' : 'abcd4545', 'k2' : 'abab1234', 'k3' : 'abcd789456'}

for key, val in dic.items():
    if string == "".join(list(val)[:len(string)]):
        print(key)
    else:
        pass

它浏览字典值中的前四个字母(通过列出所有字符并仅连接前四个字符来完成此操作)。如果它等于所需的字符串,它将打印密钥。

但是,复杂度随着字典的长度和其中的值的长度而增加,因为它创建了值中所有字符的列表。因此,我认为代码可以进行改进和优化。

我敢肯定您可以对其进行优化,但这就是我要做的。