如何解决检查元素是否属于与字典中的键相关联的列表,而没有for循环
问题表述:
检查元素是否属于与字典中的键相关联的值的列表,并返回键的索引。
字典的每个键都与值列表关联。例如:
498 : {1299,45,78}
875 :{45,104,200,300,456}
词典中键的数量为 30,000
elements = [45,65,65,...,104,...,875]#元素由大约 900,000 个整数值组成
算法做什么?
查找字典中的每个元素,并返回其所属键的索引。
例如:
45 属于键号 498 和 875
我尝试了什么?
for elt in elements:
Keys_indices_elt = [key for key,list in dictionary.items() if elt in list]
出了什么问题?
嵌套循环的使用效率不高,返回30,000个键和900,000个元素之间的映射大约需要9个小时。
解决方法
您想要的是在处理循环之前构建反向索引。
它看起来应该像这样:
{
1299: {498},45: {498,875},78: {498},104: {875},# etc.
}
要构建它,您只需遍历字典并将字典中的值用作反向索引中的键即可。像这样:
rev_idx = {}
for k,v in my_dict.items():
for e in v:
if e in rev_idx:
rev_idx[e].add(k)
else:
rev_idx[e] = {k}
这当然会占用一些内存和处理时间,但是随后您几乎可以立即获得900,000个元素中每个元素的答案。我希望通过这种方法,您的程序将运行大约2秒钟而不是9个小时。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。