Python:在嵌套字典中选择键

外国人

我有一个具有以下结构的嵌套字典:

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字典中的所有“ description”键,将其降至一个for loop。一次,但是我没有成功:

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

seqs
{}

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

普拉纳夫·霍桑加迪(Pranav Hosangadi)

我认为您误会了filter()从文档:

filter(function, iterable)
根据函数可返回true的iterable元素构造一个迭代器。

所以当你这样做

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]

仅提供hit*来自topHitsDict['record301']

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*字典的描述为此,可以使用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 = []

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

或理解为:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章