您可以轻松地用很短的功能解决这个问题:
def lookup(dct, *args):
for needle in args:
dct = {key: value for key, value in dct.items() if needle in value}
return dct
例如:
>>> dic = {1: "a1+b+c", 2: "a1+c+v", 3: "a1+z+e", 4: "a2+p+a", 5: "a2+z+v", 6: "a3+q+v"}
>>> lookup(dic, "a1", "c")
{1: 'a1+b+c', 2: 'a1+c+v'}
但是总是需要遍历所有键为每个“针”。你可以做的更好,如果你有一个辅助字典(我会在这里使用一个collections.defaultdict
)存储匹配一个针,所有的键(假设+
应该是在你的字典中的分隔符):
from collections import defaultdict
helperdict = defaultdict(set)
for key, value in dic.items():
for needle in value.split('+'):
helperdict[needle].add(key)
这helperdict
现在包含匹配值的一个特定组成部分,所有的按键:
>>> print(dict(helperdict))
{'z': {3, 5}, 'p': {4}, 'a1': {1, 2, 3}, 'a3': {6}, 'v': {2, 5, 6}, 'a2': {4, 5}, 'e': {3}, 'b': {1}, 'a': {4}, 'c': {1, 2}, 'q': {6}}
而且使用set.intersection
可以让你快速获得所有比赛的不同组合:
>>> search = ['a2', 'z']
>>> matches = set.intersection(*[helperdict[needle] for needle in search])
>>> {match: dic[match] for match in matches}
{5: 'a2+z+v'}
这绝对大于第一种方法,需要更多的外部存储器,但如果你打算做几个查询会快很多。