Python 如何根据部分字符串匹配筛选词典?

Python 如何根据部分字符串匹配筛选词典?,python,string,python-3.x,dictionary,lookup,Python,String,Python 3.x,Dictionary,Lookup,我有一本价值观词典: 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", ...} 我在Flask中有一个页面,在字典中每个部分字符串值都有复选框,例如复选框“a”、“b”、“c”,。。。在页面上,复选框位于a1、a2、a3等组中 我需要根据所选复选框的值按部分值筛选字典,例如,在组a1中选择“c”时,它将返回: 1: a1+b+c 2: a1+c+v 5: "a2+

我有一本价值观词典:

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", ...} 
我在Flask中有一个页面,在字典中每个部分字符串值都有复选框,例如复选框“a”、“b”、“c”,。。。在页面上,复选框位于a1、a2、a3等组中

我需要根据所选复选框的值按部分值筛选字典,例如,在组a1中选择“c”时,它将返回:

 1: a1+b+c
 2: a1+c+v
 5: "a2+z+v"
当从组a2中选择“z”时,它将返回:

 1: a1+b+c
 2: a1+c+v
 5: "a2+z+v"
生成错误的代码是:

sol = [k for k in dic if 'a1' in k]

有人能给我指一下正确的方向吗

您可以通过一个很短的函数轻松解决此问题:

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'}

然而,这总是需要迭代每个“针”的所有键。如果您有一个助手字典(这里我将使用一个),它存储与一个指针匹配的所有键(假设
+
应该是您字典中的分隔符),您可以做得更好:

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}}
使用可快速获得不同组合的所有匹配项:

>>> search = ['a2', 'z']
>>> matches = set.intersection(*[helperdict[needle] for needle in search])
>>> {match: dic[match] for match in matches}
{5: 'a2+z+v'}
它肯定比第一种方法要长,并且需要更多的外部内存,但如果您计划执行多个查询,则速度会快得多