我有一个具有以下结构的嵌套字典:
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
{}
任何和所有帮助将不胜感激!
我认为您误会了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] 删除。
我来说两句