Python 无循环多条件查找字典中的元素
我有一个类似下面的字典(但有10k个键值对):Python 无循环多条件查找字典中的元素,python,dictionary,for-loop,Python,Dictionary,For Loop,我有一个类似下面的字典(但有10k个键值对): python中有没有一种方法可以找到key.split(“*”[0]==2,key.split(“*”[2]==“+”和val[1]可以将filter与set()一起使用: test_dict={'2*foo*+':['5','10'],'3*bar*-':['15':'20']} 可能性=列表(筛选器(lambda x:int(x[0]。拆分(“*”[0])==2和x[0]。拆分(“*”[2]==“+”和int(x[1][1])
python中有没有一种方法可以找到
key.split(“*”[0]==2
,key.split(“*”[2]==“+”
和val[1]可以将filter
与set()一起使用:
test_dict={'2*foo*+':['5','10'],'3*bar*-':['15':'20']}
可能性=列表(筛选器(lambda x:int(x[0]。拆分(“*”[0])==2和x[0]。拆分(“*”[2]==“+”和int(x[1][1])<15,test_dict.items())
当被问到这个问题时,答案是否定的。在找到匹配项之前,如果不依次查看每个字典,就无法测试字典的键和值
但是,如果您构建更复杂的数据结构(可能由一系列DICT组成),以便条目也通过key.split(“*”[0]
)索引,那么您只需在这些元素上循环
(听起来您确实在尝试构建内存中的数据库-您最好使用一个合适的数据库,并依靠缓存将其大部分保存在内存中。)您注意到“这是嵌套到另一个for循环中的更大代码的一部分”所以我建议你在外循环之前建立一个关键部分的索引。索引将包含与单个条件匹配的键集。因为它们包含集合,所以可以找到快速交点以找到满足关键点条件的关键点
from collections import defaultdict
key_index_num = defaultdict(set)
key_index_word = defaultdict(set)
key_index_sign = defaultdict(set)
for key in test_dict:
num, word, sign = key.split('*')
key_index_num[num].add(key)
key_index_word[word].add(key)
key_index_sign[sign].add(key)
这样就很容易在内部循环中找到关键点。假设您要查找所有具有num=='2'
和符号=='+'
的键。通过执行以下操作查找密钥:
keys = key_index_num['2'].intersection(key_index_sign['+'])
注意:我已经建立了三个索引,但是如果你的键的三个部分总是唯一的,你可以建立一个键索引。代码将如下所示:
from collections import defaultdict
key_index = defaultdict(set)
for key in test_dict:
for key_part in key.split('*'):
key_index[key_part].add(key)
和密钥搜索将如下所示:
keys = key_index['2'].intersection(key_index['+'])
filter
不是要在集合上循环吗?当printing@Hrant固定的x[0]。拆分(“*”[0]
必须转换为int
。通常过滤器+lambda
由于函数调用开销,比干净列表理解慢一点……我想x[1][1]
也是如此。通过这种方式,感谢我现在能想到的最好的性能改进是构建另一个字典,它的键与key.split('*')
上的两个条件相匹配,其值是原始test\u dict
dict的对应值列表,或者如果您需要的话,它的键值对。在您的示例中,您必须将('2','+')
传递给新的dict,然后在相应的列表上循环,并对值应用您的条件。创建表需要一些处理,但由于使用了哈希,访问速度会快得多。
from collections import defaultdict
key_index = defaultdict(set)
for key in test_dict:
for key_part in key.split('*'):
key_index[key_part].add(key)
keys = key_index['2'].intersection(key_index['+'])