字典中的字典,获取值的公共键

2 投票
3 回答
618 浏览
提问于 2025-04-18 14:36

我有一个非常大的字典,里面又包含了很多字典,结构大概是这样的:

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)]

撰写回答