通过多个条件在字典中搜索元素而不循环

时间:2017-08-25 14:11:54

标签: python dictionary for-loop

我有一个类似下面的字典(但有10k键值对):

test_dict={'2*foo*+':['5','10'],'3*bar*-':['15','20']}

在python中是否有办法找到key.split("*")[0]==2key.split("*")[2]=="+"val[1]<15的元素而不循环字典。它很容易通过for循环来完成,但在我的情况下,这是一个嵌入另一个for循环的更大代码的一部分,因此需要很长时间才能完成。

谢谢,

3 个答案:

答案 0 :(得分:1)

据我所知,答案是否定的。在找到匹配项之前,无法依次查看每个字典的键和值,直到找到匹配项为止。

但是,如果您构建一个更复杂的数据结构(可能包含一系列dicts),以便条目key.split("*")[0]索引,那么您只需要遍历那些元件。

(听起来好像你正在尝试构建一个内存数据库 - 你可能最好只使用一个合适的数据库,并依靠缓存来保留大部分内存。)

答案 1 :(得分:0)

您可以将filterset()

一起使用
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['+'])