我想在字典中找到前N个字符与另一个字符串相同的值。
例如:
我想获取前4个字符均为“ abcd”的所有值并返回其键值
string = "abcd"
dict = {'k1' : 'abcd4545', 'k2' : 'abab1234', 'k3' : 'abcd789456'}
结果:应返回k1和k3
我认为可以通过循环字典中的所有值并获取前N个字符进行比较来完成。
但是我需要处理包含大量数据的字典,有什么更好的方法吗?
答案 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....}
现在,您可以根据上面的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
它浏览字典值中的前四个字母(通过列出所有字符并仅连接前四个字符来完成此操作)。如果它等于所需的字符串,它将打印密钥。
但是,复杂度随着字典的长度和其中的值的长度而增加,因为它创建了值中所有字符的列表。因此,我认为代码可以进行改进和优化。
我敢肯定您可以对其进行优化,但这就是我要做的。