我有一个类似下面的字典(但有10k键值对):
test_dict={'2*foo*+':['5','10'],'3*bar*-':['15','20']}
在python中是否有办法找到key.split("*")[0]==2
,key.split("*")[2]=="+"
和val[1]<15
的元素而不循环字典。它很容易通过for
循环来完成,但在我的情况下,这是一个嵌入另一个for
循环的更大代码的一部分,因此需要很长时间才能完成。
谢谢,
答案 0 :(得分:1)
据我所知,答案是否定的。在找到匹配项之前,无法依次查看每个字典的键和值,直到找到匹配项为止。
但是,如果您构建一个更复杂的数据结构(可能包含一系列dicts),以便条目也由key.split("*")[0]
索引,那么您只需要遍历那些元件。
(听起来好像你正在尝试构建一个内存数据库 - 你可能最好只使用一个合适的数据库,并依靠缓存来保留大部分内存。)
答案 1 :(得分:0)
您可以将filter
与set()
:
test_dict={'2*foo*+':['5','10'],'3*bar*-':['15':'20']}
possibilities = list(filter(lambda x: int(x[0].split("*")[0]) == 2 and x[0].split("*")[2] == "+" and int(x[1][1]) < 15, test_dict.items()))
答案 2 :(得分:0)
你注意到&#34;这是一个更大的代码的一部分,它嵌套在另一个for循环中#34;所以我建议你在外循环之前建立一个关键部分的索引。您的索引将包含符合各个条件的键集。因为它们包含集合,所以您可以找到快速交叉点来查找满足关键条件的键。
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'
和sign == '+'
的所有密钥。通过执行以下操作找到密钥:
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['+'])