Python:在嵌套字典中选择键

Python:在嵌套字典中选择键,python,dictionary,nested,Python,Dictionary,Nested,我有一个嵌套字典,其结构如下: topHitsDict = {'record301': {'query': 'OBGP2018240_Oncorhynchus.clarkii', 'hit1': {'description': 'OBGP-2018-240_Oncorhynchus.clarkii', 'score': '340', 'eval': '2e-94'}, 'hit2

我有一个嵌套字典,其结构如下:

topHitsDict = 
{'record301': 
    {'query': 'OBGP2018240_Oncorhynchus.clarkii',
        'hit1': 
            {'description': 'OBGP-2018-240_Oncorhynchus.clarkii',
            'score': '340',
            'eval': '2e-94'},
        'hit2': 
            {'description': 'OBGP-2017-332_Oncorhynchus.clarkii',
            'score': '340',
            'eval': '2e-94'},
    'numTopHits': 2},
'record302': 
    {'query': 'OBGP2018248_Oncorhynchus.kisutch',
        'hit1': 
            {'description': 'OBGP-2018-248_Oncorhynchus.kisutch',
            'score': '340',
            'eval': '2e-94'},
        'hit2': 
            {'description': 'OBGP-2018-038_Oncorhynchus.kisutch',
            'score': '340',
            'eval': '2e-94'},
        'hit3': 
            {'description': 'OBGP-2017-271_Oncorhynchus.kisutch',
            'score': '340',
            'eval': '2e-94'},
    'numTopHits': 3},
'record303':
    {'query': 'OBGP2019056_Oncorhynchus.tshawytscha',
       'hit1':
            {'description': 'OBGP-2019-056_Oncorhynchus.tshawytscha',
            'score': '340',
            'eval': '2e-94'},
        'hit2':
            {'description': 'OBGP-2017-356_Oncorhynchus.tshawytscha',
            'score': '340',
            'eval': '2e-94'},
        'hit3': 
            {'description': 'OBGP-2017-052_Oncorhynchus.tshawytscha',
            'score': '340',
            'eval': '2e-94'},
    'numTopHits': 3},
'record304':
    {'query': 'OBGP2019190_Oncorhynchus.nerka',
        'hit1': 
            {'description': 'OBGP-2019-191_Oncorhynchus.nerka',
            'score': '340',
            'eval': '2e-94'},
        'hit2': 
            {'description': 'OBGP-2019-190_Oncorhynchus.nerka',
            'score': '340',
            'eval': '2e-94'},
    'numTopHits': 2}
}
我想访问所有hitx子字典中的“描述”键

我知道我可以使用for循环,并且我尝试了以下想法,通过循环使用recordx字典,然后一次性访问recordx字典中hitx字典中的所有“描述”键,我可以将其保持为一个for循环,但我没有取得任何成功:

hits = dict(filter(lambda item: 'hit' in item[0], topHitsDict['record301'].items()))
seqs = dict(filter(lambda item: 'description' in item[0], hits.items()))

seqs
{}

任何和所有的帮助将不胜感激

除非您坚持使用1个循环单独处理每个
记录xxx
键,否则您需要2个循环来完成此操作。
而且列表理解比
过滤器
更容易阅读/理解

desc = [
    v["description"]
    for _, value in topHitsDict.items()
    for k, v in value.items()
    if "hit" in k
]

除非您坚持使用1个循环分别处理每个
recordxxx
键,否则需要2个循环来完成此操作。
和列表理解比
过滤器
更容易阅读/理解

desc = [
    v["description"]
    for _, value in topHitsDict.items()
    for k, v in value.items()
    if "hit" in k
]

我想你误解了我的意思。从文档中:

过滤器(函数,可编辑)

从iterable的那些元素构造一个迭代器,函数为其返回true

所以当你这么做的时候

hits = dict(filter(lambda item: 'hit' in item[0], topHitsDict['record301'].items()))
你基本上在做:

hits = {}
for item in topHitsDict['record301'].items():
    if 'hit' in item[0]:
        hits[item[0]] = item[1]
它只提供
topHitsDict['record301']
中的
hit*

hits = {'hit1': {'description': 'OBGP-2018-240_Oncorhynchus.clarkii',
  'score': '340',
  'eval': '2e-94'},
 'hit2': {'description': 'OBGP-2017-332_Oncorhynchus.clarkii',
  'score': '340',
  'eval': '2e-94'}}
相反,你真正想要的是那些
hit*
dict的描述。为此,可以使用
map
,然后将迭代器转换为列表

descriptions = list(map(lambda item: item[1]['description'], hits.items())
# descriptions: ['OBGP-2018-240_Oncorhynchus.clarkii', 'OBGP-2017-332_Oncorhynchus.clarkii']
这相当于:

descriptions = []
for item in hits.items():
    descriptions.append(item[1]['description'])
如果您想对
topHitsDict
的所有键执行此操作,则必须对其进行一些更改。使用循环:

all_descriptions = []
for recordVal in topHitsDict.values():
    hits = dict(filter(lambda item: 'hit' in item[0], recordVal.items()))
    descriptions = list(map(lambda item: item[1]['description'], hits.items())
    # Add to all_descriptions
    all_descriptions = all_descriptions + descriptions
首先把它们写成循环几乎总是比较容易的。然后,您可以将它们作为列表或听写理解编写,然后使用
filter()
map()

或者作为一种理解:

all_descriptions = [hitval["description"] for record in topHitsDict.values() for hitname, hitval in record.items() if "hit" in hitname]

我想你误解了我的意思。从文档中:

过滤器(函数,可编辑)

从iterable的那些元素构造一个迭代器,函数为其返回true

所以当你这么做的时候

hits = dict(filter(lambda item: 'hit' in item[0], topHitsDict['record301'].items()))
你基本上在做:

hits = {}
for item in topHitsDict['record301'].items():
    if 'hit' in item[0]:
        hits[item[0]] = item[1]
它只提供
topHitsDict['record301']
中的
hit*

hits = {'hit1': {'description': 'OBGP-2018-240_Oncorhynchus.clarkii',
  'score': '340',
  'eval': '2e-94'},
 'hit2': {'description': 'OBGP-2017-332_Oncorhynchus.clarkii',
  'score': '340',
  'eval': '2e-94'}}
相反,你真正想要的是那些
hit*
dict的描述。为此,可以使用
map
,然后将迭代器转换为列表

descriptions = list(map(lambda item: item[1]['description'], hits.items())
# descriptions: ['OBGP-2018-240_Oncorhynchus.clarkii', 'OBGP-2017-332_Oncorhynchus.clarkii']
这相当于:

descriptions = []
for item in hits.items():
    descriptions.append(item[1]['description'])
如果您想对
topHitsDict
的所有键执行此操作,则必须对其进行一些更改。使用循环:

all_descriptions = []
for recordVal in topHitsDict.values():
    hits = dict(filter(lambda item: 'hit' in item[0], recordVal.items()))
    descriptions = list(map(lambda item: item[1]['description'], hits.items())
    # Add to all_descriptions
    all_descriptions = all_descriptions + descriptions
首先把它们写成循环几乎总是比较容易的。然后,您可以将它们作为列表或听写理解编写,然后使用
filter()
map()

或者作为一种理解:

all_descriptions = [hitval["description"] for record in topHitsDict.values() for hitname, hitval in record.items() if "hit" in hitname]

您需要首先迭代所有记录,然后检查每个记录的值是否为
dict
。如果值为dict,则搜索
说明
,并将其附加到列表中:

description = list()

for key,records in topHitsDict.items():
    for inner_key, inner_value in records.items(): 
        if type(inner_value) is dict and "description" in inner_value.keys():   
            description.append(inner_value['description'])

print(description)

您需要首先迭代所有记录,然后检查每个记录的值是否为
dict
。如果值为dict,则搜索
说明
,并将其附加到列表中:

description = list()

for key,records in topHitsDict.items():
    for inner_key, inner_value in records.items(): 
        if type(inner_value) is dict and "description" in inner_value.keys():   
            description.append(inner_value['description'])

print(description)

非常感谢你的精彩解释。这对我帮助很大!非常感谢你的精彩解释。这对我帮助很大!