字典中的字典,查找值的共同键

-1 投票
2 回答
549 浏览
提问于 2025-04-18 14:35

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

'470046757': {'Cmstrk': 'cms_trk_dcs_04:CAEN', 'Crate': 'easyCrate4', 'Board': 'easyBoard10', 'Branch': 'branchController04', 'TrackerSY': 'CMS_TRACKER_SY1527_9', 'Channel': 'channel002\n'} 

接下来的元素是

'3646457': {'Cmstrk':'cms_trk_dcs_13:CAEN',...,'Channel':'channel005\n'}

依此类推。

这里的 key1'2383495',而 key2(也就是第一个字典的值)可能是 CmstrkCrate、...、Channel 等等,每个 key1 对应的值可能会在不同的 key1 中是一样的(所有的 key1 之间都是不同的)。

我想知道两个或多个值可以共享的 key1,也就是说,如果我输入 branchController04,CMS_TRACKER_SY1527_9,我需要找出所有具有这个属性的 key1

我已经写了一个脚本,可以根据某个 key2 的值返回对应的 key1(比如我输入 channel002\n,它会返回 '54654556'),但是我不知道如何找到共享的 key1

2 个回答

0
def db_position(db, search_name):
    # Iterating over main dict
    for main_key, main_value in zip(db.keys(), db.values()):
        # over secondary dict(s)
        for secn_key, secn_value in zip(main_value.keys(), main_value.values()):
            if secn_value == search_name:
                print("Main: ", main_key)
                print("Secn: ", secn_key)

database = dict()
database.update({'470046757': {'Cmstrk': 'cms_trk_dcs_04:CAEN',
                               'Crate': 'easyCrate4',
                               'Board': 'easyBoard10',
                               'Branch': 'branchController04',
                               'TrackerSY': 'CMS_TRACKER_SY1527_9',
                               'Channel': 'channel002\n'}})
database.update({'3646457': {'Cmstrk': 'cms_trk_dcs_13:CAEN',
                             'Channel': 'channel005\n'}})

db_position(database, 'easyCrate4')

运行:

>python dicts.py
('Main: ', '470046757')
('Secn: ', 'Crate')
0

如果我理解没错的话,你不知道要查找哪个 key2

keyword = 'branchController04'
matchingKey2 = None
foundKey1s = []
for k1 in myDict:
    if not matchingKey2 :
        for k2 in myDict[k1]:
            if myDict[k1][k2]==keyword:
                matchingKey2 = k2
                foundKey1s.append(k1)
    else:
        if myDict[k1][matchingKey2]==keyword:
            foundKey1s.append(k1)

补充:在重新阅读你的问题后,我明白了可能是任何一个 key2。如果是这样的话:

keyword = 'branchController04'
foundKey1s = {k1 for k2 in myDict[k1] for k1 in myDict if myDict[k1][k2]==keyword}

我使用一个集合来处理在一个子字典中可能有多个 k2 值与 keyword 匹配的情况。

撰写回答