字典中的字典,获取值的公共键
我有一个非常大的字典,里面又包含了很多字典,结构大概是这样的:
Dict={,
...
'25465466':{'Cmstrk': 'cms_trk_dcs_05:CAEN', 'Crate': 'easyCrate0', 'Board': 'easyBoard06', 'Branch': 'branchController05', 'TrackerSY': 'CMS_TRACKER_SY1527_4', 'Channel': 'channel003\n'},
'436232302': {'Cmstrk': 'cms_trk_dcs_03:CAEN', 'Crate': 'easyCrate1', 'Board': 'easyBoard01', 'Branch': 'branchController05', 'TrackerSY': 'CMS_TRACKER_SY1527_8', 'Channel': 'channel002\n'},
'470311412': {'Cmstrk': 'cms_trk_dcs_03:CAEN', 'Crate': 'easyCrate0', 'Board': 'easyBoard00', 'Branch': 'branchController05', 'TrackerSY': 'CMS_TRACKER_SY1527_4', 'Channel': 'channel003\n'},
...
}
如果用户输入 cms_trk_dcs_05:CAEN
或者 easyCrate1/easyBoard01
,或者这些值的其他组合,脚本就需要返回那些它们共有的键(像 '654546536' 这样的数字)。
举个例子,如果输入是 easyCrate0/CMS_TRACKER_SY1527_4
,那么返回的结果就是 470311412,25465466
。
3 个回答
0
最终编辑:
这是更简洁的代码:
from collections import OrderedDict
find = raw_input("What are you looking for? ")
finder = find.split('/')
similar = []
for key in Dict:
for x in range(0, len(finder)):
for pairs in Dict[key].items():
if pairs[1] == finder[0]:
similar.append(key)
if len(similar) == 1 or len(finder) == 1:
print ",".join(similar)
for items in similar:
similar.remove(items)
print ",".join(list(OrderedDict.fromkeys(similar)))
0
我想这应该会有帮助。
Dict = {
'25465466':{'Cmstrk': 'cms_trk_dcs_05:CAEN', 'Crate': 'easyCrate0', 'Board': 'easyBoard06', 'Branch': 'branchController05', 'TrackerSY': 'CMS_TRACKER_SY1527_4', 'Channel': 'channel003\n'},
'436232302': {'Cmstrk': 'cms_trk_dcs_03:CAEN', 'Crate': 'easyCrate1', 'Board': 'easyBoard01', 'Branch': 'branchController05', 'TrackerSY': 'CMS_TRACKER_SY1527_8', 'Channel': 'channel002\n'},
'470311412': {'Cmstrk': 'cms_trk_dcs_03:CAEN', 'Crate': 'easyCrate0', 'Board': 'easyBoard00', 'Branch': 'branchController05', 'TrackerSY': 'CMS_TRACKER_SY1527_4', 'Channel': 'channel003\n'}
}
def sub_search(terms):
check = lambda k: all(map(lambda term:term in Dict[k].values(), terms))
return [key for key,value in Dict.items() if check(key)]
def search(term):
terms = term.split('/')
return sub_search(terms)
search('cms_trk_dcs_05:CAEN')
#['25465466']
search('easyCrate1/easyBoard01')
#['436232302']
0
inp = "easyCrate0/CMS_TRACKER_SY1527_4".split("/")
common = []
for k in Dict:
if all(x in Dict[k].values() for x in inp): # if all of the values match the user input, add it to common list
common.append(k)
print (common)
['25465466', '470311412']
你也可以使用集合:
common = []
for k in Dict:
if len(set(inp).intersection(Dict[k].values())) == len(inp):
common.append(k)
你还可以用列表推导式:
common = [k for k in Dict if len(set(inp).intersection(Dict[k].values())) == len(inp)]