2017-08-01 207 views
1

我有值的字典:如何根據部分字符串匹配過濾字典?

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", ...} 

我在燒瓶內的頁面,其具有用於每個部分的字符串值複選框在字典中,例如複選框「A」,「B」,「C」,...等等在頁面上,該複選框位於組A1,A2,A3等

我需要的部分值來過濾詞典基於所選擇的複選框的值,例如,A1組中選擇的「c」時,它會返回:

1: a1+b+c 
2: a1+c+v 

當從組A2中選擇的「Z」,它將返回:

5: "a2+z+v" 

,其產生錯誤的代碼是:

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

有人能指點我正確的方向嗎?

回答

1

您可以輕鬆地用很短的功能解決這個問題:

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

這絕對大於第一種方法,需要更多的外部存儲器,但如果你打算做幾個查詢會快很多。