Python 无循环多条件查找字典中的元素

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])

我有一个类似下面的字典(但有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])<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['+'])